3

最近継承したアプリケーションの単体テストを作成しようとしています。以前のプログラマーが使っていたものなので、現在 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 など) を引き出す方法がわかりません。

それで、私が求めているのは次のとおりです。

  1. これらの入力パラメータにアクセスして、正しい引数がデータ サービスに渡されていることを確認するにはどうすればよいですか? それは可能ですか?
  2. 私が現在やろうとしていることよりも、これを行うためのより良い方法はありますか?

解決

//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);
4

1 に答える 1

3

これらの入力パラメーターにアクセスして、正しい引数がデータサービスに渡されていることを確認するにはどうすればよいですか?それも可能ですか?

アクションから「コード」の詳細を抽出することはできないため、基本的にはできません(プロパティを設定しないアクションを渡すとどうなるかを考えてください。これは完全に合法ですが、仮想的なメカニズムを壊してしまいます)。

ただし、代わりにこれを試すことができます。

  1. 初期値でエンティティを作成する
  2. Arg.Invoke引数を使用して、選択したオブジェクトをアクションパラメータとして使用するようにNSubstituteに指示します
  3. エンティティのプロパティ値が変更されたことを確認します

例えば:

// Arrange
var entity = new ContactProductLink
{
    ContactRoleId = // ...
    // ...
};

mockDataSupplierService
    .Create<ContactProductLink>(Arg<ContactProductLink>.Invoke(entity));

// Act
// ...

Assert.That(entity.ContactRoleId, Is.EqualTo(2));
// ...
于 2013-01-02T22:31:28.427 に答える