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