将T4用于接口的代码生成模拟对象是一个好主意吗?

时间:2009-10-07 15:27:43

标签: .net testing mocking

我熟悉单元测试,但我仍然在学习模拟和模拟框架。我得到了想法(我认为),但语法似乎仍然有点异国情调。我正在考虑创建一些自动生成接口和类的模拟实现的T4模板。使用泛型和扩展方法的组合,这可以让我做这样的事情:

var service = new MockCustomerService(); //code-generated and implements ICustomerService, has a method named 'Insert'
var target = new CustomerController(service);
var item = new Customer();
target.Insert(item);
service.InsertMethod.Assert.WasLastCalledWith(item);

或:

var service = new MockCustomerService(); //code-generated and implements ICustomerService, has a method named 'GetById'
var target = new CustomerController(service);
var item = new Customer();
target.GetByIdMethod.ShouldReturn(item);
var actual = target.Edit(1);
service.GetByIdMethod.Assert.WasLastCalledWith(1);
Assert.AreEqual(actual.ViewData.Model, item);

首先,这是否真的“嘲弄”,或者我错过了一些基本的东西。其次,这似乎是一种合理的方法,还是有理由使用框架而不必手动创建类似的类?第三,那里有什么相似的东西吗?我环顾四周,找不到多少......

1 个答案:

答案 0 :(得分:0)

  

首先,这是否真的“嘲弄”,   或者我错过了一些基本的东西。

你展示的第二个例子,在这一行发生的模拟:

target.GetByIdMethod.ShouldReturn(item);

这使您可以为target.GetByIdMethoditem),返回虚假值,而不会实际调用target.GetByIdMethod

  

其次,这似乎是这样的   是一个合理的方法,还是在那里   使用超越框架的原因   不必手动创建类似的   类?

我们使用模拟框架的原因是我们想要为某些方法返回假值,以便我们可以轻松控制我们想要测试的内容。此外,通过使用模拟框架,我们还可以断言调用了正确的方法,和/或使用正确的参数。

  

第三,还有别的吗?   有类似的吗?

你是什​​么意思?你是说有任何嘲弄框架做类似的事情吗?或者那里有任何单元测试代码模板生成引擎吗?有很多mocking frameworks out there。至于是否有任何单元测试代码模板生成引擎,嗯,我不确定。