2017-09-20 105 views
2

我有空隙法:cmd設置變量名

this._dispatcher.PushAsync(handler, cmd); 

執行後,我已經改變了性質:

cmd.Result = userId; 

如何設置後執行無效方法屬性值在單元測試中?

我想類似的東西:

_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

首先你想在回調中分配一個值。 ==不分配值是相等比較。

其次不需要模擬模型。只需創建一個實例並使用它。您可以隨時通過參數在回調中訪問它。

第三,作爲被嘲笑的方法是異步的,你需要返回一個任務,以便代碼可以流到完成。

//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"; 
    }); 

這就是現在建立的方法調用接受任何有效論據,只是將通過的命令的結果設置爲固定的結果。因此,您可以輕鬆測試實際測試的事件是否正確調用調度程序對象。