基本的な問題はプレゼンターのテスト方法です。Model View Presenterテストの解決策... DTOまたはDomainオブジェクト、またはその両方を使用しますか?
テイク: ドメインオブジェクト(最終的にDBに保持されます) ベース属性されているID(DB ID、INT/GUID /何でも)とTransientID(保存、GUIDまでローカルID)
domainObjectの
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とFで計算されていることですそれはtransientIDで計算されているので、transientIDが何であるかを知る方法がないので、モックリポジトリでの等価性のチェックができません。
1)LastCall.Ignoreとメソッドが呼ばれましたことをjsutテストで自分自身をコンテンツが、コールの内容をテストしていない:
回避策は今のところです。
2)DTOをテストしてサービスに保存します。サービスは、ドメインへのマッピングを処理する以上のものです。
3)カスタムロジックを使用して成功を判断する偽のテストリポジトリを作成します。
- 1はロジックの大部分をテストしません。 --2は、良い目的ではない、たくさんの余分なコードです.3潜在的に脆弱であるようです。今私は、DTOのと、それは階層間の最大の分離を与えるが、おそらく75%不要であることを理論的にサービスに傾いてる
は...
それは間違いなく一見の価値がある、ありがとう。 – Gary