在c#中使用NMock3,即使我没有告诉它抛出,模拟也会抛出异常

时间:2014-04-22 20:19:00

标签: c# .net unit-testing nmock

我看过很多帖子,解释了如何使用NMock来预期异常。但这不是我想知道的。在我的情况下,我正在测试快乐的道路。但看起来像只要在try / catch中调用mock上调用的方法就会抛出异常。 所以假设我正在测试的类中有一个方法:

class MyClass
{
    public MyClass(some_type obj)
    {
        m_member = obj;
    }

    public void Func()
    {
        try
        {
            m_member.some_function()
        }
        catch (System.Exception e)
        {
            // do something
        }
    }

    private some_type m_member;
}

在这个类的单元测试中,我在MyClass中测试了这个Func来测试快乐的路径:

[Test]
public void TestFunc()
{
    MockFactory mock_factory = new MockFactory();
    Mock<some_type> mock = mock_facoty.CreateMock<some_type>();
    MyClass uut = new MyClass(); 

    mock.Expects.One.MethodWith(_ => _.some_function());
    uut.Func();

    mock_facoty.VerifyAllExpectationsHaveBeenMet();
    mock_facoty.ClearExpectations();
}

此单元测试始终失败。如果我删除了代码中的try / catch而只是(第8 - 18行):

    public void Func()
    {
        //try
        //{
            m_member.some_function()
        //}
        //catch (System.Exception e)
        //{
        //    // do something
        //}
    }

此测试将正常运行。

有没有人知道为什么会这样?我怎么能做这个工作? 非常感谢你!

1 个答案:

答案 0 :(得分:1)

您实际上并未使用模拟对象,而是使用some_type语句在MyClass构造函数中创建具体(真实)new对象。

我建议您更改MyClass类以接受some_type对象作为构造函数参数:

public MyClass(some_type thetype)
{
    m_member = thetype;
}

然后,在您的测试方法中,将模拟对象传递给ctor:

MockFactory mock_factory = new MockFactory();
Mock<some_type> mock = mock_factory.CreateMock<some_type>();
MyClass uut = new MyClass(mock.MockObject);

这意味着您的MyClass实例将实际使用模拟对象,然后您可以对其进行验证...

如果你不能一直改变你的构造函数以获得一个必需的参数,你可以使用一个穷人的依赖注入(不推荐但可能是必要的):

public MyClass() : this(new some_type()) {}

public MyClass(some_type thetype)
{
    m_member = thetype;
}