【发布时间】:2011-12-07 04:27:56
【问题描述】:
基本问题是如何测试演示者。
采取: 域对象(最终会被持久化到数据库中) 基本属性是 Id(DB ID,Int/GUID/Whatever)和 TransientID(保存前的本地 ID,GUID)
域对象
namespace domain {
public class DomainObject {
private int _id;
private Guid transientId;
public DomainObject()
{
_transient_Id = Guid.NewGuid();
}
}
}
PresenterTest:
var repository = Mock.StrictMock();
var view = Mock.StrictMock();
view.Save += null;
var saveEvent = LastCall.Ignore().GetEventRaiser();
var domainObject = new DomainObject() {Id = 0, Attribute = "Blah"};
Mock.ExpectCall(Repository.Save(domainObject)).Returns(True);
Mock.ReplayAll();
var sut = new Presenter(repository, view);
Save_Event.raise(view, EventArgs.Empty);
Mock.Verify()
所以这里的问题是域对象身份是用 ID 计算的,而它是用瞬态 ID 计算的,没有办法知道瞬态 ID 是什么,所以我不能让模拟存储库检查是否相等。
目前的解决方法是:
1) LastCall.Ignore 并满足于 jsut 测试方法被调用但不测试调用的内容。
2) 编写 DTO 进行测试并保存到服务中。服务然后处理到域的映射。
3) 编写一个虚假的 testRepository,使用自定义逻辑来确定成功。
--1 不测试大部分逻辑。 --2 是很多额外的代码,没有什么好用的 --3 似乎很脆弱。
现在我倾向于 DTO 和理论上的服务,它在层之间提供最大的隔离,但可能 75% 是不必要的......
【问题讨论】:
标签: c# design-patterns tdd mocking mvp