ASP.Net MVC - What do Mocks do?
本文关键字:do Mocks What Net MVC ASP | 更新日期: 2023-09-27 18:05:36
我是ASP新手。. Net MVC -我正在阅读一本MVC的书,下面的代码在书中的一个示例应用程序中测试分页:
[TestMethod]
public void Can_Paginate()
{
// Arrange
// - create the mock repository
Mock<IProductRepository> mock = new Mock<IProductRepository>();
mock.Setup(m => m.Products).Returns(new Product[] {
new Product {ProductID = 1, Name = "P1"},
new Product {ProductID = 2, Name = "P2"},
new Product {ProductID = 3, Name = "P3"},
new Product {ProductID = 4, Name = "P4"},
new Product {ProductID = 5, Name = "P5"}
}.AsQueryable());
// create a controller and make the page size 3 items
ProductController controller = new ProductController(mock.Object);
controller.PageSize = 3;
// Action
IEnumerable<Product> result = (IEnumerable<Product>)controller.List(2).Model;
// Assert
Product[] prodArray = result.ToArray();
Assert.IsTrue(prodArray.Length == 2);
Assert.AreEqual(prodArray[0].Name, "P4");
Assert.AreEqual(prodArray[1].Name, "P5");
}
问题是Mock
做什么?我不能把Product
的数组直接传递给ProductController
吗?为什么是这一轮?
mock和它们的对应物存根的概念在单元测试应用程序时使用。在这种情况下,它们被用来设置控制器可以用来测试其行为的假数据。mock和stub的概念可能会让您难以理解。
试着读一下Martin Fowler写的这篇叫做mock不是stub的文章。当进行单元测试时,你不想调用数据库或文件系统(或者它们是集成测试),因此我们模拟对外部依赖项的调用
在上面测试代码的实例中,模拟IProductRepository类,因为它可能连接到数据库。这意味着我们可以模拟它的行为并返回我们需要返回的数据来测试Action方法的其余部分基本上通过在底层接口中定义具有相同方法和属性的代理来模拟实现IProductRepository
的类的实例。
下面的代码行设置结果,它将在Products
属性的get访问器被调用时立即返回。
mock.Setup(m => m.Products).Returns(...);
关于ProductController
,我相信它的构造函数有类型IProductRepository
的参数,所以要实例化ProductController
并测试它,你必须实例化一个实现IProductRepository
的类实例并将其传递给控制器的构造函数,模拟IProductRepository
允许你专注于控制器的测试,而不关心IProductRepository
实现的任何细节。mock是一种正确的方法,可以模拟测试中只有一个接口的类的依赖关系。所以你正在测试ProductController
,所有的依赖项都是模拟的。
看起来它正在使用模拟API(可能是Moq)来创建该接口的模拟实现以用于测试目的。它是有用的,因为有时真正的对象会做一些事情,比如连接数据库或其他不利于测试的资源。
http://code.google.com/p/moq/