2017-09-20 44 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"; 
    }); 

这就是现在建立的方法调用接受任何有效论据,只是将通过的命令的结果设置为固定的结果。因此,您可以轻松测试实际测试的事件是否正确调用调度程序对象。