moq.verify-使用继承类型时对基本类型进行测试的通用方法

时间:2019-02-11 19:44:17

标签: c# unit-testing generics moq

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

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

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

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

public class  DerivedEvent: BaseEvent{}

我致电订阅如下:

myEvent.Subscribe<DerivedEvent>()

在单元测试中,我想验证是否使用从基本Event派生的任何类进行了调用。 这会通过,但使用派生类。

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

这被称为零次:

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

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

1 个答案:

答案 0 :(得分: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的验证失败。