为什么要使用模拟框架而不是手动滚动我们的模拟?

时间:2009-12-18 18:48:35

标签: mocking

目前我正在读一本书(Pro ASP.Net Framework)。

在本书中,作者建议使用Moq framework来帮助进行TDD。

[Test]
public void List_Presents_Correct_Page_Of_Products()
{
    IProductsRepository repository = MockProductsRepository(
        new Product { Name = "P1" }, new Product { Name = "P2" },
        new Product { Name = "P3" }, new Product { Name = "P4" },
        new Product { Name = "P5" }
    );

    ProductsController controller = new ProductsController(repository);
    ...
}


static IProductsRepository MockProductsRepository(params Product[] prods)
{
    // Generate an implementor of IProductsRepository at runtime using Moq
    var mockProductsRepos = new Moq.Mock<IProductsRepository>();
    mockProductsRepos.Setup(x => x.Products).Returns(prods.AsQueryable());
    return mockProductsRepos.Object;
}

在模型层中,我们定义了一个FakeRepository和一个SqlRepository。

事实是我没有看到使用这个moq框架的优势。为什么我们不使用我们的FakeRepository?或者清除我们的FakeRepository并在其上添加假产品?

起初,我认为moq框架可以生成虚假数据,所以如果你有100个假对象可以生成,那么你不必这样做。

我想念的是什么?

5 个答案:

答案 0 :(得分:13)

模拟框架优于手工模拟的一些优点:

  • 模拟行为更接近测试代码,因为它是 in 测试代码。这使得测试更容易理解而无需查看其他代码。
  • 您不需要再创建另一个模拟类(或者更糟糕的是:为现有模型添加逻辑)只是因为您需要稍微不同的行为。
  • 你最终会编写更少的样板文件,因为你只需要设置你想要模拟的方法,而使用手工滚动的方法你必须实现整个界面。

一些缺点:

  • 你必须学习一个框架,而任何人都可以手工编写模拟。
  • 这是您添加到项目中的另一个依赖项。

(这是我现在能想到的。随意编辑并添加更多内容。)

答案 1 :(得分:2)

模拟框架减轻了创建独特模拟对象的负担,这些对象返回特定于测试用例的数据。它们还允许测试某些方法或属性是否已被访问或修改(由模拟对象的消费者)。这使您可以更轻松地测试并强制执行某些预期行为。

模拟框架只是工具。当然你可以手动完成,但你可能会发现自己花时间维护仅用于测试的类。

可以使用类似的问题here

答案 2 :(得分:1)

答案 3 :(得分:-1)

我们将其用于在客户端/服务器环境中制作假服务器。

这样,调用不必从客户端到服务器一直到数据库再返回。他们只是去模拟服务器,它被告知返回给定呼叫的某个对象/值,并期望进行某些调用。

答案 4 :(得分:-1)

Mocking允许您控制进入的输入以验证输出是否正确。例如,您可以传入您知道会出错的数据,然后测试您的方法是否实际抛出该错误,并且您可以传入有效数据并测试有效数据是否从对象返回。

框架不仅仅是Moq;有RhinoMocks和TypeMock(我个人最喜欢的,虽然它确实花钱,除非它是一个开源项目),仅举几例。