目前我正在读一本书(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个假对象可以生成,那么你不必这样做。
我想念的是什么?
答案 0 :(得分:13)
模拟框架优于手工模拟的一些优点:
一些缺点:
(这是我现在能想到的。随意编辑并添加更多内容。)
答案 1 :(得分:2)
模拟框架减轻了创建独特模拟对象的负担,这些对象返回特定于测试用例的数据。它们还允许测试某些方法或属性是否已被访问或修改(由模拟对象的消费者)。这使您可以更轻松地测试并强制执行某些预期行为。
模拟框架只是工具。当然你可以手动完成,但你可能会发现自己花时间维护仅用于测试的类。
可以使用类似的问题here。
答案 2 :(得分:1)
答案 3 :(得分:-1)
我们将其用于在客户端/服务器环境中制作假服务器。
这样,调用不必从客户端到服务器一直到数据库再返回。他们只是去模拟服务器,它被告知返回给定呼叫的某个对象/值,并期望进行某些调用。
答案 4 :(得分:-1)
Mocking允许您控制进入的输入以验证输出是否正确。例如,您可以传入您知道会出错的数据,然后测试您的方法是否实际抛出该错误,并且您可以传入有效数据并测试有效数据是否从对象返回。
框架不仅仅是Moq;有RhinoMocks和TypeMock(我个人最喜欢的,虽然它确实花钱,除非它是一个开源项目),仅举几例。