2017-09-20 3 views
2

でのメソッドの実行後に私がvoidメソッド持っている変数名を設定します。は、ユニットテスト

this._dispatcher.PushAsync(handler, cmd); 

を実行した後、私はcmdのプロパティを変更しました:

cmd.Result = userId; 

私は、実行voidメソッドの後にプロパティの値を設定するにはどうすればよいですユニットテストで?

私はそのような何かしようとしている:

_dispatcher = new Mock<IDispatcher>(); 
_a = new Mock<SaveUserCmd>(); 
_dispatcher 
    .Setup(r => r.PushAsync(_cmdHandler, this._cmd)) 
    .Callback(() => _a.SetupProperty(y => y.Result == this._response)); 

をしかし、それは示しています...

(Error: Expression is not a property access:y => y.Result == this._response).

SaveUserCmd

public class SaveUserCmd 
{ 
    public string FirstName { get; set; } 

    public string LastName { get; set; } 

    public object Result { get; set; } 
} 

IDispatcher

public interface IDispatcher 
{ 
    Task PushAsync<TCommand>(ICommandHandlerAsync<TCommand> commandHandlerAsync, TCommand message); 
} 
+0

「間違っている」とはどういう意味ですか?例外はありますか?予期しない動作? – HimBromBeere

答えて

2

まず、コールバックに値を割り当てたいとします。 ==は値を割り当てていないため、等価比較です。

2番目のモデルを模擬する必要はありません。インスタンスを作成して使用するだけです。コールバックでは常にパラメータを使用してアクセスできます。

第3に、モックされるメソッドが非同期であるため、コードを完了するためにタスクを返す必要があります。

//Arrange 
var dispatcher = new Mock<IDispatcher>(); 
var cmd = new SaveUserCmd(); 
var userId = "some value here"; 
dispatcher.Setup(r => r.PushAsync(_cmdHandler, cmd)) 
    .Callback((ICommandHandlerAsync<SaveUserCmd> h, SaveUserCmd c) => c.Result = userId)) 
    .Returns(Task.FromResult((object)null)); 
0

_a.SetupPropertyあなたは(一般的には、後のモックを初期化することは正しいアプローチになることはありません)何をしたいのかではありませんモック_aのプロパティを設定します。代わりに、実際のオブジェクトのプロパティに値を代入したいだけです。

あなたはまた、あなたのモックメソッドの呼び出しに渡された正確なインスタンスを与えるのオーバーロードを持つ.Callback()を使用していることを簡単に行うことができます

_dispatcher 
    .Setup(r => r.PushAsync(It.IsAny<ICommandHandlerAsync<SaveUserCmd>>(), It.IsAny<SaveUserCmd>())) 
    .Callback((handler, cmd) => { 
     cmd.Result = "static result"; 
    }); 

この設定メソッドの呼び出しが今ちょうど任意の有効な引数を受け入れ、渡されたコマンドの結果を固定結果に設定します。したがって、実際にテストされたものがディスパッチャオブジェクトを適切に呼び出すかどうかを簡単にテストできます。