【问题标题】:AutoMocker QuestionAutoMocker 问题
【发布时间】:2010-12-22 02:30:32
【问题描述】:

我正在尝试测试我的控制器,但它们每个都依赖于依赖于存储库的服务。我有以下代码...

Mock.Get(controller.Get<ServiceInterface>())
            .Setup(s => s.GetData())
            .Returns(FakeData.Create<Entity>(25));

我不断收到与 ServiceInterface 具体类相关的错误,该类没有其存储库的默认实例(注入)。我试图避免创建 FakeService,但看起来这就是我必须要做的。谁能给点建议?

【问题讨论】:

    标签: asp.net asp.net-mvc-2 moq structuremap automocking


    【解决方案1】:

    My response to this question 展示了如何对服务进行编程以实现接口,将该接口用作依赖项,然后模拟该服务以帮助您进行单元测试。

    编辑

    没有任何使用 MoqAutoMocker 的经验,我的建议有些有限。但我会先尝试直接使用 Moq,看看这是否会给您带来任何麻烦。

    var serviceMock = new Mock<IService>();
    serviceMock.Setup(r => r.GetData())
        .Returns(FakeData.Create<Entity>(25));
    var controller = new MyController(serviceMock.Object);
    

    一旦你确定这可行,你就可以引入它的自动模拟功能:

    var autoMocker = new MoqAutoMocker<MyController>();
    Mock.Get(autoMocker.Get<IService>()).Setup(r => r.GetData())
        .Returns(FakeData.Create<Entity>(25));
    MyController controller = autoMocker.ClassUnderTest;
    

    【讨论】:

    • 感谢 Stripling...我的服务已经实现了一个接口。有关更多信息,请参阅第二个答案的评论。
    • @jsteve:你的控制器依赖于服务接口,还是具体的类?如果您的构造函数指定它使用接口,那么 AutoMock 似乎不太可能知道具体类的依赖关系。
    【解决方案2】:

    您要测试哪些类以及要排除哪些类?我猜您正在尝试测试您的控制器,并且想要删除您的服务。如果是这种情况,您的服务的具体实现以及它的依赖项根本不应该参与您的测试并且应该是无关紧要的。您应该只需要删除测试控制器所需的服务接口的行为。

    我只是在猜测您的意图,所以如果我的回答没有意义,您可能需要发布更多代码来显示您要测试的内容。

    【讨论】:

    • 我的控制器对我的服务有注入依赖,而我的服务对存储库有注入依赖。我正在尝试模拟我的服务以便可以注入它,但我遇到的问题是当我尝试模拟我的服务时,我收到与 AutoMocker 无法将模拟存储库注入模拟服务相关的错误。希望这能解释更多。
    • 这真的没有意义。如果您的控制器依赖于服务接口,并且控制器不直接依赖于存储库接口,那么当您模拟服务接口时,NOTHING 不应该依赖于存储库,在这种情况下,它不应该出现在您的测试中。您是否在测试设置中使用存储库接口?你的 FakeData 类使用它吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 2021-10-11
    相关资源
    最近更新 更多