【问题标题】:moq.verify - generic method tested with base type when inherited type is usedmoq.verify - 使用继承类型时使用基类型测试的泛型方法
【发布时间】:2019-07-05 09:12:23
【问题描述】:

当我只能检查基类型时,如何验证是否使用继承类型对泛型方法进行了调用。

我有一个通用方法的接口:

public interface IEvent
{
   void Subscribe<T>() where T : BaseEvent;
}

我的代码有几个继承自 BaseEvent 的派生事件。这是一个:

public class  DerivedEvent: BaseEvent{}

我按如下方式调用订阅:

myEvent.Subscribe<DerivedEvent>()

在单元测试中,我想验证调用是使用从基事件派生的任何类进行的。 这将通过,但它使用派生类。

v.Subscribe<DerivedEvent>(), Times.Exactly(1));

这被调用零次:

v.Subscribe<BaseEvent>(), Times.Exactly(1));

如何验证通用方法 Subscribe 是否被任何 BaseEvent 调用?

【问题讨论】:

  • 旁注:有点奇怪的是,任何事件源(​​出于某种原因称为IEvent)都可以触发所有可能的事件......考虑IEventSource&lt;out TEvent&gt;是否会更好地工作(out) ...然后你就不需要这个奇怪的测试了。
  • 它并不是真正的 IEvent - 我只是缩短了帖子的名称(与 BaseEvent 和 DerivedEvent 相同)。这是尚未编写的代码的单元测试。代码必须使用 BaseEvent 调用订阅,但代码本身将使用派生自 BaseEvent 的类。只有一个事件,但在测试创建时我不知道类。
  • 但这实际上应该可以工作......:/ myEvent.Verify(m =&gt; m.Subscribe&lt;BaseEvent&gt;(), Times.Exactly(1));这是你在打电话吗?
  • @DonChambers 我对“代码必须使用 BaseEvent 调用订阅,但代码本身将使用派生自 BaseEvent 的类”感到困惑。 - 示例代码可能会有所帮助...我认为 Moq 不支持“查看是否没有调用任何其他具体版本的通用方法”的情况...创建实现您的“IEvent”接口的测试类可能更容易,并且以某种方式公开订阅者列表以供稍后验证(而不是模拟它)。
  • github 示例是在传递泛型参数时。我正在调用一个通用方法。我试过: v.Subscribe(), Times.Exactly(1));它没有用。我错过了什么吗?

标签: c# unit-testing generics moq


【解决方案1】:

如何验证泛型方法 Subscribe 是否被任何 BaseEvent 调用?

因为 Moq 不完全匹配通用参数,而是通过分配兼容性(如果您对实现感兴趣,请参阅 herehere),以下应该可以工作:

public class BaseEvent { }
public class DerivedEvent1 : BaseEvent { }
public class DerivedEvent2 : BaseEvent { }

public interface IEvent
{
    void Subscribe<T>() where T : BaseEvent;
}


var eventMock = new Mock<IEvent>();

eventMock.Object.Subscribe<DerivedEvent1>();
eventMock.Object.Subscribe<DerivedEvent2>();

eventMock.Verify(m => m.Subscribe<BaseEvent>(), Times.Exactly(2));

注意Verify 是如何用BaseEvent 表达的,但实际调用是指两个不同的派生类型。

这将通过,但它使用派生类。

v.Subscribe<DerivedEvent>(), Times.Exactly(1));

这被调用零次:

v.Subscribe<BaseEvent>(), Times.Exactly(1));

您必须显示更多实际测试代码以进一步诊断为什么在您的特定情况下基于BaseEvent 的验证失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 2019-11-22
    • 2015-05-14
    • 2018-09-27
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多