关于单元测试和犀牛模拟的一些问题

时间:2011-11-24 23:26:20

标签: c# unit-testing tdd mocking rhino-mocks

我是编写单元测试的新手,所以我一同学习。我正在使用带有MsTest框架的Rhino Mocks并有一些问题。

我在哪里可以找到关于犀牛嘲讽的一些文档,用解释概述其功能,所以我可以打印并检查?

我已经看到了以下两种关于期望的技术的大量例子,这对于特定情况更好或更适合?

Expect.Call( delegate { mockTestClass.MethodToMock(param) } ).Return(true);

var mockTestClass = MockRepository.GenerateMock<TestClass>();

mockTestClass.Expect( m => m.MethodToMock(param) ).Return( true );

接下来我想知道存根和模拟类之间的区别是什么以及在哪些场景中应该使用什么?

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

  

我在哪里可以找到关于犀牛嘲讽的一些文档,用解释概述其功能,所以我可以打印并检查?

Rhino Mocks文档为here,好的wiki为here。一般情况下,请注意提及3.3或更低版本的任何内容,因为它会有些过时。

  

对于特定情况哪个更好或更适合?

第二种方式更多&#34;流利&#34;并推荐。

  

存根和嘲笑之间有什么区别

以下是一些资源:

如果您刚开始使用这些概念,我认为您最好不要使用NUnit和Moq。 Here's an introduction示例。

答案 1 :(得分:0)

如果您想检查调用的具体方法并且返回值无关紧要,我建议使用AAA syntaxAssertWasCalled()方法:

// Arrange
var mock = MockRepository.GenerateMock<ICustomType>();
var service = new MyService(mock);

// Act
service.DoSomething();

// Assert 
// ensures that SomeMethod of the mock was called 
// whilst service.DoSomething() call
mock.AssertWasCalled(m => m.SomeMethod());

RhinoMocks框架透视图中的存根和模拟之间的区别如下:

  • 可以为Mocks和Stub设置期望但是它们仅针对Mocks进行验证,例如,您将无法指定Repeat().Any()等等以便存根
  • 访问方法或属性时,存根永不失败,所有属性和方法都返回default(T)给定的返回类型T,Stub的属性是普通属性

有关Mocks和Stubs之间差异的更多详细信息,请参阅Mauricio答案中提供的一系列良好链接,我建议Martin Fowler的工作。