繁体   English   中英

c#犀牛嘲笑 - 这是否适合使用嘲讽?

[英]c# Rhino mocks - Is this an appropriate use of mocks?

请原谅我的无知。 我正在努力学习犀牛。

public Foo(Stream stream)
{
    if (stream == null) throw new ArgumentNullException("woot");
    if (!stream.CanRead) throw new NotSupportedException("sporkish");
    if (!stream.CanSeek) throw new NotSupportedException("monkey");
}

我想通过对这些异常进行测试来测试NUnit测试的这个函数。 这是模拟对象的适当用法,还是我真的需要创建一个特殊的继承类Stream? 如果嘲笑是合适的,我该如何使用Rhino? 我可以弄清楚如何从函数(我认为)返回虚拟值,但不是属性。

您可以创建Stream的模拟,指示它无法读取且无法搜索,如下所示

MockRepository mocks = new MockRepository();

Stream mockStream = mocks.StrictMock<Stream>();

Expect.Call(mockStream.CanRead).Return(false);
Expect.Call(mockStream.CanSeek).Return(false);

mocks.ReplayAll();

// Perform the unit test.

mocks.VerifyAll();

关于嘲笑的一些值得记住的事情:

  1. 模拟不仅仅是创建返回虚拟值的对象。 一个好的模拟框架测试是否已访问类的特定成员。 这使您可以测试以查看正在测试的类正在对依赖对象进行正确调用。 在上面的例子,如果你没有看过这两个CanReadCanSeek的时候VerifyAll()被调用时,一个异常将被抛出失败测试。
  2. 在对接口进行测试时,模拟最有用。 您可以在特定类型中覆盖的行为越少,模拟效果就越差。 对于Stream ,您可以覆盖您关注的属性,因此您可以轻松实现创建模拟的目标。 如果你想模拟一个非虚拟/可覆盖的属性,你将面临更艰巨的任务。

对于您的场景,为了测试抛出的三个异常,您需要创建两个单独的模拟以到达所有代码路径:一个失败第一个断言( !stream.CanRead ),另一个传递第一个断言并且失败第二个断言( !stream.CanSeek )。

这是模拟的适当用法。 你需要三个模拟对象。 一个没有stream.CanRead ,一个没有stream.CanSeek ,一个有两个(为了成功测试)。

不要忘记,这可能涉及将您正在使用的Stream功能分解为单独的界面(以便您可以从界面构建模拟对象)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM