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

时间:2017-09-20 09:28:54

标签: c# unit-testing .net-core moq xunit

我有无效的方法:

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

2 个答案:

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

此设置方法调用现在接受任何有效参数,并将传递的命令的结果设置为固定结果。因此,您可以轻松地测试实际测试的事物是否正确调用调度程序对象。