在单元测试中执行方法后设置变量名

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对象。