【问题标题】:Is it a good idea to use T4 to code-gen mock objects for interfaces?使用 T4 为接口生成模拟对象代码是个好主意吗?
【发布时间】:2009-10-07 15:27:43
【问题描述】:

我熟悉单元测试,但仍在学习模拟和模拟框架。我明白了(我认为),但语法似乎仍然有点陌生。我正在考虑创建一些自动生成接口和类的模拟实现的 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);

首先,这真的是“嘲弄”吗,还是我错过了一些基本的东西。其次,这似乎是一种合理的方法,或者除了不必手动创建类似的类之外,还有其他理由使用框架吗?第三,还有其他类似的东西吗?我环顾四周,并没有找到太多...

【问题讨论】:

    标签: .net testing mocking


    【解决方案1】:

    首先,这真的是“嘲弄”吗? 还是我错过了一些基本的东西。

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

    target.GetByIdMethod.ShouldReturn(item);
    

    这使您可以为target.GetByIdMethod (item) 返回一个假值, 实际上没有调用target.GetByIdMethod

    第二,这看起来像吗? 是一个合理的方法,或者有 使用超越框架的原因 不必手动创建类似的 上课?

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

    第三,还有什么其他的吗? 有没有类似的?

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

    【讨论】:

    • 感谢您的回答。为了清楚起见,我说的是代码生成来生成实际的具体模拟对象,而不是生成单元测试。换句话说,我认为 T4 生成 MockCustomerService 可能比使用 RhinoMocks、Moq 等在运行时生成它更好。
    猜你喜欢
    • 1970-01-01
    • 2013-10-03
    • 2021-06-05
    • 1970-01-01
    • 2011-05-14
    • 2017-06-06
    • 2010-09-30
    • 2022-11-16
    • 2011-05-31
    相关资源
    最近更新 更多