【问题标题】:Mocking a method and returning different results模拟一个方法并返回不同的结果
【发布时间】:2010-07-16 12:39:35
【问题描述】:

我有一个稍微复杂的方法,需要经过很好的测试。秘制酱料。好吧,也许不是那么酷,但我不是 100% 确定如何设置这些东西。这种源于我之前的问题here。我没有使用过 rhino 模拟,所以我仍然很糟糕/不知道语法,所以请随时提出大量建议。

Public Function GenerateAllNotifications(ByVal days As List(Of Integer)) As List(Of MailMessage) Implements INotificationService.GenerateAllNotifications

     Dim someStuff = _someService.GetThingsThatExpireBetween(day1, day2)

     'build some messages

     Return messages

End Function

我在测试中的设置是这样的……但我知道这是错误的

Dim fakeStuff = New SomeItem()

Dim fakeContext = New List(Of Provider)
fakeContext.Add(fakeStuff)
Dim someService = MockRepository.GenerateStub(Of ISomeService)()
someService.Stub(Function(x) x.GetThingsThatExpireBetween(30, 60)).IgnoreArguments().Return(fakeContext.AsQueryable)
_fakeNotificationService = New NotificationService(someService)

我想要完成的是从该服务中返回一个已执行的项目。业务规则是基于给定过期时间的消息集合。因此,如果给定实体将在 30 天内到期,则消息会反映,如果是 60、90 等,则将它们放入消息中。我认为我的问题是我每次都需要返回不同的对象(某些项目)......?

【问题讨论】:

  • 您能说明一下您要达到的目标吗?并且可能至少粘贴处理消息的代码大纲?
  • 消息是最终结果,因此它不如获取数据以正确构建这些重要(这是一种过滤方法)。传达信息很容易,但获得正确的东西来传达信息却并非如此。我需要不同的对象来返回每个 GetThings,因为它们会被过滤掉(这是预期的)......我开始怀疑我是否需要根据输入单独返回每个对象(30,60 等等)跨度>
  • 当您存根/模拟一个方法时,您指定返回指定值的参数。你不能只定义一些存根吗?如果您希望有人帮助您,您确实需要粘贴一些简化的代码。
  • 哈,这就是简化代码!是的,似乎我必须根据给定的输入将每一个都作为一个单一的回报。否则我必须创建一个完整的 ISomeService ,这样它就不会是一个纯粹的单元测试。

标签: unit-testing vba rhino-mocks mocking


【解决方案1】:

似乎您正在尝试使您的模拟行为正确。如果您认为您的 mock 可以为您的被测类的行为提供上下文,它可能会有所帮助。

  • 鉴于我的模拟会以某种方式表现
  • 当我使用我的课时
  • 那么我期待这个结果

然后,您可以使您的模拟行为以不同的方式 - 无论参数如何 - 并检查您的类在这些不同情况下的行为是否适当。您将对每个上下文进行新的测试。我经常根据上下文中的行为来命名我的测试:

  • 如果没有找到,应该给我一个空列表
  • 应处理并返回找到的东西
  • 如果服务抛出异常,应提供错误消息

等等,只有驼峰式和[Test] 署名。

这有帮助吗?如果不是,我可能误解了这个问题 - 道歉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多