2

我正在开发一个 VB.NET 项目,该项目需要大量使用单元测试,但在模拟类时遇到问题。

以下是问题的细分:

  • 使用 NUnit 和 Rhino Mock 3.6
  • VS2010 & VB.NET

  • 我有一个包含许多方法和一个事件的接口。

  • 当调用其中一种方法时,实现该接口的类会引发事件。

当我在测试中模拟对象时,我可以存根方法并毫无问题地创建/断言对方法的期望。

如何配置模拟对象,以便在调用方法时引发事件,以便我可以断言已引发?

我发现许多使用 C# 的帖子都建议使用这样的代码

mockObject.MyEvent += null...

当我尝试此“MyEvent”时,Intellisense 中没有出现。

我显然没有正确配置我的测试/模拟,但是有这么少的 VB.NET 示例,我正在画一个空白。

4

1 回答 1

2

对不起,我缺乏 VB 语法;我是一个 C# 人。另外,我认为您应该为编写测试而感到祝贺,无论是先测试还是最后测试。

我认为您的代码需要重构。听起来你有一个需要实现来包含事件的接口,然后另一个类(你正在测试)依赖于这个接口。然后,当某些事情发生时,被测代码会执行该事件。

我心中的问题是,“为什么它是公开的event?” 为什么不只是实现可以定义的方法?我想event可能有多个delegates 被动态添加到某个地方,但如果这是你真正需要的东西,那么实现应该弄清楚它是如何工作的。您可以event用一对方法替换 :HandleEvent([event parameters])AddEventListener(TheDelegateType listener). 我认为这些的含义和用法应该足够明显了。如果实现想在event内部使用 s ,它可以,但我觉得这是一个接口用户不应该关心的实现细节。他们应该关心的只是添加他们的监听器并且所有监听器都被调用。然后你可以断言HandleEvent或者AddEventListener被称为。这可能是使其更易于测试的最简单方法。

如果您确实需要保留event,请参阅此处以获取有关 mocking的信息delegate。我的建议是模拟 a delegate,在设置期间将其添加到事件中,然后断言它被调用。如果您需要测试是否将事物添加到事件中,这也可能很有用。

另外,我不会过多地依赖 Intellisense。我相信,模拟是通过一些狡猾的 IL 代码完成的。我不会指望 Intellisense 跟上其对象的成员,尤其是当您开始超越常规方法时。

于 2013-05-06T02:53:47.113 回答