【问题标题】:Set variable name after method execution in Unit test在单元测试中方法执行后设置变量名
【发布时间】:2017-09-20 09:28:53
【问题描述】:

我有 void 方法:

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 =&gt; 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);
}

【问题讨论】:

  • “错了”是什么意思?有什么例外吗?意外行为?

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


【解决方案1】:

首先您要在回调中分配一个值。 == 没有赋值,它是相等比较。

第二次不需要模拟模型。只需创建一个实例并使用它。您可以随时在回调中通过参数访问它。

第三个被模拟的方法是异步的,你需要返回一个任务,这样代码才能完成。

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

【讨论】:

    【解决方案2】:

    _a.SetupProperty 将设置模拟 _a 的属性,这不是您想要做的(通常,稍后初始化模拟永远不是正确的方法)。相反,您只想为实际对象的属性分配一个值。

    您可以使用 .Callback() 轻松做到这一点,它还具有重载,可为您提供传递给模拟方法调用的确切实例:

    _dispatcher
        .Setup(r => r.PushAsync(It.IsAny<ICommandHandlerAsync<SaveUserCmd>>(), It.IsAny<SaveUserCmd>()))
        .Callback((handler, cmd) => {
            cmd.Result = "static result";
        });
    

    此设置方法调用现在接受任何有效参数,并将传递命令的结果设置为固定结果。这样你就可以轻松测试实际测试的东西是否正确调用了dispatcher对象。

    【讨论】:

      猜你喜欢
      • 2014-10-16
      • 1970-01-01
      • 1970-01-01
      • 2018-05-06
      • 1970-01-01
      • 2017-07-23
      • 1970-01-01
      • 2018-08-01
      • 1970-01-01
      相关资源
      最近更新 更多