我有一個像這樣的抽象工廠。使用Moq嘲諷具體類方法的返回值
public abstract class AbstractFactory
{
public abstract ISyncService GetSyncService(EntityType entityType);
}
而且我有它的具體實現。
public class SyncFactory : AbstractFactory
{
private readonly IOperatorRepository _operatorRepository;
public SyncFactory(IOperatorRepository operatorRepository)
{
_operatorRepository = operatorRepository;
}
public override ISyncService GetSyncService(EntityType entityType)
{
return new OperatorSyncService(_operatorRepository);
}
}
這個混凝土工廠是用這種方法訪問的。
public void MethodTobeTested()
{
var syncService =
new SyncFactory(_operatorRepository).GetSyncService(entityType);
}
現在我需要爲MethodTobeTested()編寫一個單元測試。
我像這樣嘲笑了GetSyncService()的返回值。但它調用的是實際的OperatorSyncService,而不是模擬。我需要這個模擬嘲笑裏面OperatorSyncService
private Mock<SyncFactory> _syncServiceMock;
_syncServiceMock = new Mock<SyncFactory>();
_syncServiceMock.Setup(m => m.GetSyncService(operator)).Returns(_operatorSyncServiceMock.Object);
另一種方法就如何解決這個任何想法?
爲什麼不簡單地模擬IOperatorRepository並調用方法 – ChrisBint
'MethodToBeTested'與'SyncFactory'緊密耦合,因爲該方法手動創建'SyncFactory'的新實例。這使得嘲笑依賴非常困難。 – Nkosi