使用摩尔的相互作用测试

时间:2011-11-03 16:56:38

标签: unit-testing mstest moles

如何使用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");
    }

}

我真的很感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

就个人而言,我使用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(字符串)方法。你将它设置为回调你的局部变量并将其设置为true。然后你调用应该调用日志的方法,并断言你的当地现在是真的。

同样,我通常会使用Moq并使用myStub.Verify()来实现此目的,因此有可能使用我不知道的痣来实现这一点。就个人而言,我认为Moles更适合“嘲笑不可嘲讽”,我更喜欢Moq(用于我自己的接口和类)和Moq(用于框架和外部性,如File I / O,GUI,Db连接等)的组合。 )。