当我只能检查基本类型时,如何验证是否使用继承的类型对泛型方法进行了调用。
我有一个具有通用方法的接口:
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调用?
答案 0 :(得分:1)
如何验证是否使用任何
Subscribe
调用了通用方法BaseEvent
?
由于Moq并非完全匹配泛型参数,而是通过分配兼容性(如果您对实现感兴趣,请参见here和here),以下内容应该可以工作:
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
的验证失败。