【问题标题】:Mock rabbitMQ IModel verify error模拟 rabbitMQ IModel 验证错误
【发布时间】:2017-02-09 08:27:34
【问题描述】:

我有一个简单的单元测试,需要验证我的方法是否调用了IModel.BasicPublish 方法。所以我写了一个简单的单元测试:

[TestMethod]
    public void RequestAdded()
    {
        const string url = "http://localhost";
        var urlBytes = Encoding.UTF8.GetBytes(url);

        _proxyService.AddRequest(url);

        _moqModel.Verify(x => x.BasicPublish(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<IBasicProperties>(), urlBytes), Times.Once);
    }

但是,当我运行时出现错误: invalid verify on a non-virtual member.

我认为这只会发生在具体类上,而不是接口上。

private Mock&lt;IModel&gt; _moqModel;

有什么想法吗?

【问题讨论】:

  • 你试过了吗... _moqModel.As().Verify(x => x.BasicPublish(It.IsAny(), It.IsAny(), It.IsAny(), urlBytes), Times.Once);
  • 请检查BasicPublish是接口成员还是扩展方法。将 BasicPublish 作为扩展方法而不是实际成员可能会导致此异常
  • 提供可用于重现问题的minimal reproducible example。此示例中没有足够的上下文,因为当前显示的内容不应导致该错误。

标签: c# unit-testing rabbitmq


【解决方案1】:

基本发布签名:

public void BasicPublish(string exchange, string routingKey, bool mandatory, IBasicProperties basicProperties, byte[] body)

Moq 和其他类似的模拟框架只能模拟接口、抽象方法/属性(在抽象类上)或虚拟方法/属性在具体类上。

这是因为它会生成一个代理来实现接口或创建一个派生类来覆盖那些可覆盖的方法以拦截调用。

【讨论】:

  • 这应该被标记为正确答案。原来RabbitMQ.Client 有一堆像BasicPublish(this IModel model, string exchange, string routingKey, IBasicProperties basicProperties, byte[] body) 这样的扩展方法在IModel 接口上不存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-27
  • 2018-10-06
  • 2018-10-22
  • 2016-12-03
  • 2018-06-03
  • 2016-07-11
相关资源
最近更新 更多