那麼,你必須提供測試雙打所有的依賴關係,不一定是嘲笑。
幸運的是,這是21世紀,有工具可以讓我們的工作更輕鬆。您可以使用AutoFixture創建OrderController
的實例,並根據需要注入mock。
var fixture = new Fixture().Customize(new AutoConfiguredMoqCustomization());
var orderController = fixture.Create<OrderController>();
其中,基本上等同於:
var factory = new Mock<IViewModelFactory>();
var repository = new Mock<INewsRepository>();
var delegateHelper = new Mock<IDelegateHelper >();
var customerContext = new Mock<ICustomerContextWrapper >();
var orderController = new OrderController(factory.Object, repository.Object, delegateHelper.Object, customerContext.Object);
如果這些依賴依賴於其他類型的,這些都被設定爲好。具有AutoConfiguredMoqCustomization
定製的AutoFixture將構建完整的依賴關係圖。
如果您需要訪問存儲庫模擬,那麼您可以稍後再做一些額外的設置或斷言,您可以將其凍結它。凍結類型將使fixture
容器包含該類型的只有一個實例,例如:
var fixture = new Fixture().Customize(new AutoConfiguredMoqCustomization());
var repositoryMock = fixture.Freeze<Mock<INewsRepository>>();
repositoryMock.Setup(x => x.Retrieve()).Returns(1);
//the frozen instance will be injected here
var orderController = fixture.Create<OrderController>();
repositoryMock.Verify(x => x.Retrieve(), Times.Once);
我使用起訂量在這些例子中,但AutoFixture也與NSubstitute,RhinoMock和FOQ集成。
披露:我是該項目的貢獻者之一
只是嘲笑所有四個注入的依賴關係。如果你不使用Moq,它應該讓嘲笑變得更容易。 – 2014-11-24 11:48:58
我使用Moq來模擬這些依賴關係(或者至少這是我的意圖) – 2014-11-24 11:49:43
嘲笑我們感興趣的四個依賴項的原因是什麼?據推測,你只需要在每個模擬對象上設置一個或兩個方法? – Chris 2014-11-24 11:51:05