我有无效的方法:
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));
但它显示......
(错误:表达式不是属性访问权限:
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 :(得分: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));
答案 1 :(得分:0)
_a.SetupProperty
将设置模拟_a
的属性,这不是您想要做的(一般来说,稍后初始化模拟永远不是正确的方法)。相反,您只想为实际对象的属性赋值。
您可以使用.Callback()
轻松完成此操作,https://jsfiddle.net/mleontenko/mmk9zo4L/也有重载,可以为您提供传递给模拟方法调用的确切实例:
_dispatcher
.Setup(r => r.PushAsync(It.IsAny<ICommandHandlerAsync<SaveUserCmd>>(), It.IsAny<SaveUserCmd>()))
.Callback((handler, cmd) => {
cmd.Result = "static result";
});
此设置方法调用现在接受任何有效参数,并将传递的命令的结果设置为固定结果。因此,您可以轻松地测试实际测试的事物是否正确调用调度程序对象。