【问题标题】:Interaction testing using moles使用鼹鼠的相互作用测试
【发布时间】:2011-11-03 16:56:37
【问题描述】:

如何使用 Moles 验证交互测试。例如,以下测试是使用 rhino mock 编写的。谁能告诉我如何使用痣来达到同样的效果?有没有类似验证痣的东西?

[Test]
public void MyTest()
{
    MockRepository mocks = new MockRepository();
    ILogger mockLogger = mocks.StrictMock<ILogger>();

    using(mocks.Record())
    {
        mockLogger .Log("this is my error");
    }

    MyClass mc = new MyClass (mockLogger);

    mc.MyFunc("abcd");
    mocks.Verify(mockLogger);
}



class MyClass
{

    private ILogger logger;

    public MyClass(ILogger logger)
    { this.logger = logger; }

    public void MyFunc(string str)
    {

        logger.log("this is my error");
    }

}

非常感谢您的帮助。

【问题讨论】:

    标签: unit-testing mstest moles


    【解决方案1】:

    就个人而言,我将 Moq 用于内部依赖,将 Moles 用于外部(以及其他人强加给我的令人不快的静态内容),所以我可能不会给你 最好的 方式,但这是一种方式:

        [TestMethod, Owner("ebd"), TestCategory("Proven"), TestCategory("Unit")]
        public void MyTest()
        {
            var myCalled = false;
            var myLogger = new SILogger();
            myLogger.LogString = (s) => myCalled = true;
            var myClass = new MyClass(myLogger);
            myClass.MyFunc("abcd");
    
            Assert.IsTrue(myCalled);
        }
    

    这里的关键思想是“SILogger”,它是 ILogger 的存根。然后,您为其“LogString”(对应于您的 log(string) 方法)设置实例行为。您将其设置为回调本地变量并将其设置为 true。然后调用应该调用 log 的方法,并断言你的本地现在是真的。

    同样,我通常会使用 Moq 执行此操作,并为此使用 myStub.Verify(),因此可能有一种更巧妙的方法来处理我不知道的痣。就个人而言,我认为 Moles 更适合“模拟不可模拟”,我更喜欢 Moq(用于我自己的接口和类)和 Moq(用于框架和外部性,如文件 I/O、GUI、Db 连接等)的组合)。

    【讨论】:

    • 感谢您的回复。我也在想同样的方法来捕获一个变量(标志)并将其设置为某个值以验证该方法是否已被调用。您是否认为使用 MOLES 来模拟内部依赖项也是一个坏主意/做法?
    • 我认为这本身并不是一个坏习惯,但我在多开发者项目中担心它,因为我认为它会鼓励糟糕的设计。您可以模拟 anything 的事实使人们得出“很酷,我们可以将所有内容设为静态/单格子并且仍然进行单元测试”这样的结论。就个人而言,我会说,如果你不得不修改你自己的代码并且不能使用像 Moq 这样的东西,那就是代码的味道。
    • Right.. 我会尽量确保即使我们使用痣,我们也会从外部正确注入每个依赖项。在比较起订量与痣时,您还有其他限制吗?
    • 嗯,我发现关于 Moles 的一件事是,与 Moq 相比,它一点也不轻。 Moles 实际上会生成整个 Moles 程序集。这会占用大量磁盘空间,并使测试运行得更慢。如果您希望其他人能够运行您的测试,您还必须签入 Moles DLL。因此,拥有单独的 Moles 和 Moq 测试程序集是有很好的动机的,并且可以将 Moles 程序集作为执行频率较低的集成测试运行。
    猜你喜欢
    • 1970-01-01
    • 2011-03-14
    • 2011-08-23
    • 2018-11-04
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    相关资源
    最近更新 更多