何时在C#单元测试中使用模拟与伪造?

vij*_*ter 50 .net c# tdd unit-testing

任何人都可以提出建议选择嘲讽与假装的理想方案,即手动设置要领吗?

我对如何处理这种情况有点困惑.

And*_*mes 83

那么你需要解决一些问题.您需要了解两件基本事项:命名法和最佳实践.

首先,我想给一个伟大的测试人员Roy Osherove提供一个很棒的视频资源:

Roy Osherove的单元测试评论

他首先说他已经对几个开源项目附带的测试工具进行了一些评论.你可以在这里找到:http: //weblogs.asp.net/rosherove/archive/tags/TestReview/default.aspx

这些基本上是视频评论,他带您了解这些测试工具,并告诉您什么是好的,什么是坏的.很有帮助.

罗伊还有一本我理解的书非常好.

命名法

这个播客将有很大帮助 :http://www.hanselminutes.com/default.aspx?showID = 187

我会解释这个播客(Hanselminutes介绍音乐是可怕的):

基本上你用隔离框架做的一切 (如Moq,Rhino Mocks,Type Mock等)都被称为 假的.

一个假冒是一个测试,你正在测试的代码来代替的生产代码中调用过程中使用的对象.伪造用于隔离您尝试从应用程序的其他部分测试的代码.

(主要)有两种类型的假货:存根模拟.

一个模拟的是,你把到位,使正在测试的代码可以调用出来给它的假,你断言,电话是用正确的参数进行.以下示例使用Moq隔离框架执行此操作:

[TestMethod]
public void CalculateTax_ValidTaxRate_DALCallIsCorrect()
{
    //Arrange
    Mock<ITaxRateDataAccess> taxDALMock = new Mock<ITaxRateDataAccess>();
    taxDALMock.Setup(taxDAL => taxDAL.GetTaxRateForZipCode("75001"))
                  .Returns(0.08).Verifiable();

    TaxCalculator calc = new TaxCalculator(taxDALMock.Object);

    //Act
    decimal result = calc.CalculateTax("75001", 100.00);

    //Assert
    taxDALMock.VerifyAll();
}
Run Code Online (Sandbox Code Playgroud)

一个存根几乎是相同的模拟,除非你把它在的地方,以确保您正在测试的代码从它的呼叫回来一致的数据(例如,如果你的代码调用数据访问层,存根将返回回假数据),但你没有断言存根本身.也就是说,您无需验证该方法是否为您的假数据访问层 - 您正在尝试测试其他内容.您提供存根以获取您尝试测试的方法以单独工作.

这是一个存根示例:

[TestMethod]
public void CalculateTax_ValidTaxRate_TaxValueIsCorrect()
{    
    //Arrange
    Mock<ITaxRateDataAccess> taxDALStub = new Mock<ITaxRateDataAccess>();
    taxDALStub.Setup(taxDAL => taxDAL.GetTaxRateForZipCode("75001"))
                  .Returns(0.08);

    TaxCalculator calc = new TaxCalculator(taxDALStub.Object); 

    //Act
    decimal result = calc.CalculateTax("75001", 100.00);

    //Assert
    Assert.AreEqual(result, 8.00);
}
Run Code Online (Sandbox Code Playgroud)

请注意,我们正在测试方法的输出,而不是该方法调用另一个资源的事实.

Moq并没有真正在模拟和存根之间进行API区分(通知都被声明为 Mock<T>),但这里的用法在确定类型时很重要.

希望这有助于让你顺利.

  • Ayende(Rhino Mocks的创造者)最近宣布,他将放弃Mock vs Stub,并在下一版Rhino Mocks中将一切变为假冒.有些人会争辩说,你知道某些东西是Stub而不是Mock,你会获得更多的知识,但这有点挑剔.如果你不在乎,只要一直使用Mocks并且不要断言他们的假设.它可以帮助您解决使用哪个问题的麻烦. (8认同)
  • 为什么人们会这样回答并没有提供理由呢? (3认同)

Esk*_*ola 17

有5种不同的测试双打:假人,存根,嘲笑,间谍和假货.一个很好的概述在http://code.google.com/testing/TotT-2008-06-12.pdf,它们也分类在http://xunitpatterns.com/Mocks,%20Fakes,%20Stubs%20and% 20Dummies.html