我看过很多帖子,解释了如何使用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
//}
}
此测试将正常运行。
有没有人知道为什么会这样?我怎么能做这个工作? 非常感谢你!
答案 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;
}