【发布时间】:2017-09-27 12:05:00
【问题描述】:
在 C# 下是否有一个很好的工具,可以通过部分测试实现来伪造复杂的接口(服务、存储库等)?
我目前使用的模拟框架 (RhinoMocks) 太慢且难以处理。
先决条件:
- 与实际实现(批量测试)相比,没有显着的性能损失
- 使用基本逻辑和数据实现(例如:字典而不是数据库表)
- 当界面改变时,无需改变测试。
完整实现示例:
public interface IMyInterface
{
int PropertyA { get; set; }
int PropertyB { get; set; }
void DoSomethingWithX(int x);
int GetValueOfY();
}
public class FakeImplementation : IMyInterface
{
private int _valueOfYCalls = 0;
public int PropertyA { get; set; }
public int PropertyB { get; set; }
public void DoSomethingWithX(int x)
{ }
public int GetValueOfY()
{
return _valueOfYCalls++;
}
}
计数器只是为了模拟初级逻辑。
问题是,如果接口获得了一个新方法,例如 SetSomeZ(int z),测试将不再构建/运行,无需显式更改。
是否有假/模拟框架,使用基本实现,但通过虚拟/覆盖或包装器自动添加成员?
比如这样:
[ImplementsInterface(nameof(IMyInterface))]
public class FakeImplementationBase
{
private int _valueOfYCalls = 0;
[ImplementsMember(nameof(IMyInterface.GetValueOfY))]
public virtual int GetValueOfY()
{
return _valueOfYCalls++;
}
}
工具/框架应该在运行时生成完整的实现类型,类似于模拟/存根,但使用基本实现,只是添加缺少的接口部分。
这不应该用于真正的单元测试,而是用于更复杂的目的。它也是具有大量接口和类的遗留软件,与“单一职责”无关。
【问题讨论】:
标签: c# mocking integration-testing partial