在单元测试中执行方法后设置变量名
Set variable name after method execution in Unit test
我有无效方法:
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);
}
首先你想在回调中赋值。 ==
不是赋值,而是相等比较。
其次无需模拟模型。只需创建一个实例并使用它。您始终可以通过参数在回调中访问它。
第三,由于要模拟的方法是异步的,因此您需要 return 一个任务,以便代码可以完成。
//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));
_a.SetupProperty
将设置 mock _a
的 属性,这不是您想要做的(通常,稍后初始化 mock 永远不是正确的方法)。相反,您只想为实际对象的 属性 赋值。
您可以使用 .Callback()
轻松做到这一点,它也有重载,可以为您提供传递给模拟方法调用的确切实例:
_dispatcher
.Setup(r => r.PushAsync(It.IsAny<ICommandHandlerAsync<SaveUserCmd>>(), It.IsAny<SaveUserCmd>()))
.Callback((handler, cmd) => {
cmd.Result = "static result";
});
此设置方法调用现在接受任何有效参数,并将传递的命令的结果设置为固定结果。这样你就可以很方便地测试实际测试的东西是否正确调用了dispatcher对象。
我有无效方法:
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);
}
首先你想在回调中赋值。 ==
不是赋值,而是相等比较。
其次无需模拟模型。只需创建一个实例并使用它。您始终可以通过参数在回调中访问它。
第三,由于要模拟的方法是异步的,因此您需要 return 一个任务,以便代码可以完成。
//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));
_a.SetupProperty
将设置 mock _a
的 属性,这不是您想要做的(通常,稍后初始化 mock 永远不是正确的方法)。相反,您只想为实际对象的 属性 赋值。
您可以使用 .Callback()
轻松做到这一点,它也有重载,可以为您提供传递给模拟方法调用的确切实例:
_dispatcher
.Setup(r => r.PushAsync(It.IsAny<ICommandHandlerAsync<SaveUserCmd>>(), It.IsAny<SaveUserCmd>()))
.Callback((handler, cmd) => {
cmd.Result = "static result";
});
此设置方法调用现在接受任何有效参数,并将传递的命令的结果设置为固定结果。这样你就可以很方便地测试实际测试的东西是否正确调用了dispatcher对象。