1

我看过很多解释如何使用 NMock 来期待异常的帖子。但这不是我想知道的。就我而言,我正在测试幸福的道路。但是只要在 try/catch 中调用模拟上调用的方法,看起来 NMock 就会抛出异常。所以假设我在我正在测试的类中有一个方法:

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
        //}
    }

该测试将正常工作。

有谁知道为什么会这样?我怎么能做到这一点?非常感谢!

4

1 回答 1

1

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

我建议更改您的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;
}
于 2014-04-22T23:31:37.177 回答