最近継承したアプリケーションの単体テストを作成しようとしています。以前のプログラマーが使っていたものなので、現在 NSubstitute を使っていますが、私はそれに執着していません。
私がテストしているメソッドは、DataService クラスの Create メソッドを呼び出します。
Create メソッドの呼び出し
var contactProductLink = this.dsService.Create<ContactProductLink>(x =>
{
x.ContactRoleId = prod.RoleId;
x.ContactId = contactViewModel.ContactId;
x.ProductId = prod.ProductId;
x.Active = true;
x.InsertDate = DateTime.Now;
x.InsertUserId = user.employeeId;
x.UpdateDate = DateTime.Now;
x.UpdateUserId = user.employeeId;
});
DataService の作成方法:
public TEntity Create<TEntity>(Action<TEntity> propertySetter = null) where TEntity : class
{
var tEntity = this.Context.Create<TEntity>();
if (propertySetter != null)
{
propertySetter(tEntity);
}
return tEntity;
}
私が取ったアプローチ (そしておそらくもっと良い方法があるかもしれません) は、NSubstitute を使用して DataService をモックすることです。最後にアサーションを行っているときは、Create メソッドが呼び出されたことを確認しています。
mockDataSupplierService.Received().Create<ContactProductLink>(Arg.Any<Action<ContactProductLink>>());
ただし、メソッドに送信された入力が正しいことも確認したいのですが、ここで問題が発生しています。Create メソッドに渡された System.Action オブジェクトを取得できますが、パラメーター (作成メソッドの呼び出しコード スニペットに投稿されている ContactRoleId、ContactId など) を引き出す方法がわかりません。
それで、私が求めているのは次のとおりです。
- これらの入力パラメータにアクセスして、正しい引数がデータ サービスに渡されていることを確認するにはどうすればよいですか? それは可能ですか?
- 私が現在やろうとしていることよりも、これを行うためのより良い方法はありますか?
解決
//Arrange
mockDataSupplierService.Create<ContactProductLink>(Arg.Do<Action<ContactProductLink>>(x=> actionToPopulateEntity = x));
//Assert
mockDataSupplierService.Received().Create<ContactProductLink>(Arg.Any<Action<ContactProductLink>>());
var entity = new ContactProductLink();
actionToPopulateEntity.Invoke(entity);
Assert.AreEqual(ExpectedContactId, entity.ContactId);