我正在嘗試為具有建構式依賴關系的類撰寫測驗Func<T>。為了成功完成被測函式需要創建多個單獨的型別物件T。
在生產環境中運行時,AutoFacT每次factory()呼叫都會生成一個新物件,但是在使用 AutoMock 撰寫測驗時,它在再次呼叫時回傳相同的物件。
下面的測驗用例顯示了使用 AutoFac 和 AutoMock 時的行為差異。我希望這兩個都通過,但是 AutoMock 一個失敗了。
public class TestClass
{
private readonly Func<TestDep> factory;
public TestClass(Func<TestDep> factory)
{
this.factory = factory;
}
public TestDep Get()
{
return factory();
}
}
public class TestDep
{}
[TestMethod()]
public void TestIt()
{
using var autoMock = AutoMock.GetStrict();
var testClass = autoMock.Create<TestClass>();
var obj1 = testClass.Get();
var obj2 = testClass.Get();
Assert.AreNotEqual(obj1, obj2);
}
[TestMethod()]
public void TestIt2()
{
var builder = new ContainerBuilder();
builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());
var container = builder.Build();
var testClass = container.Resolve<TestClass>();
var obj1 = testClass.Get();
var obj2 = testClass.Get();
Assert.AreNotEqual(obj1, obj2);
}
uj5u.com熱心網友回復:
AutoMock(來自Autofac.Extras.Moq 包)主要用于設定復雜的模擬。也就是說,您有一個具有很多依賴項的物件,并且很難設定該物件,因為它沒有無引數建構式。默認情況下,Moq 不允許您使用建構式引數設定物件,因此可以使用一些東西來填補空白。
但是,您從中獲得的模擬將被視為您可能從 Moq 中獲得的任何其他模擬。當您使用 Moq 設定模擬實體時,您不會每次都獲得一個新實體,除非您自己也實作了工廠邏輯。
AutoMock 不是用來模擬 Autofac 行為的。Func<T>Autofac 在每次呼叫時呼叫決議操作的支持Func<T>- 那是 Autofac,而不是 Moq。
使用 AutoMock 是有意義的,InstancePerLifetimeScope因為就像使用普通 Moq 設定模擬一樣,您需要能夠回傳模擬實體以對其進行配置和驗證。如果每次都是新的,那就難多了。
顯然有辦法解決這個問題,并且通過大量的重大更改,您可能可以InstancePerDependency在其中實作語意,但此時這樣做確實沒有太大價值,因為這并不是真正的目的......你總是可以創建兩個不同的AutoMock實體來獲得兩個不同的模擬。
一般來說,更好的方法是提供有用的抽象并在容器中使用 Autofac 和模擬。
例如,假設您有類似...
public class ThingToTest
{
public ThingToTest(PackageSender sender) { /* ... */ }
}
public class PackageSender
{
public PackageSender(AddressChecker checker, DataContext context) { /* ... */ }
}
public class AddressChecker { }
public class DataContext { }
如果您正在嘗試設定ThingToTest,您會看到設定 aPackageSender也很復雜,并且您可能希望像 AutoMock 這樣的東西來處理它。
但是,您可以通過在那里引入一個界面來讓您的生活更輕松。
public class ThingToTest
{
public ThingToTest(IPackageSender sender) { /* ... */ }
}
public interface IPackageSender { }
public class PackageSender : IPackageSender { }
通過隱藏介面背后的所有復雜性,您現在可以僅IPackageSender使用普通的 Moq(或您喜歡的任何其他模擬框架,甚至創建手動存根實作)進行模擬。您甚至不需要在混合中包含 Autofac,因為您可以直接模擬依賴項并將其傳入。
重點是,您可以設計自己的方式使測驗和設定更容易,這就是為什么在對您的問題的評論中,我問您為什么要這樣做(在撰寫本文時,從未得到回答) . 如果可能的話,我強烈建議設計一些更容易測驗的東西。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/372022.html
