【问题标题】:Why is my PartialMock method ignoring my expectation为什么我的 PartialMock 方法忽略了我的期望
【发布时间】:2011-04-15 18:53:57
【问题描述】:

我有一个基类,我将其用作 PartialMock

1  IContextManager contextManager = mocks.StrictMock<IContextManager>();
2  target = mocks.PartialMock<EnumerationServiceBase>(new object[] { contextManager });
3  Expect.Call(delegate { contextManager.RemoveContext(guid); });
4  mocks.ReplayAll();
5  actual = target.ReleaseOp(request);

target.ReleaseOp(request) 调用了我在第 3 行设置了期望的 contextManager.RemoveContext 方法,但我仍然收到以下错误

Rhino.Mocks.Exceptions.ExpectationViolationException: IContextManager.RemoveContext("e04c757b-8b70-4294-b133-94fd6b52ba04");预期 #0,实际 #1。

这是第一个不起作用的测试(其他 45 个左右都可以),但这也是第一个使用 A)部分模拟和 B)返回 void 的模拟方法。有什么想法吗?

【问题讨论】:

    标签: unit-testing rhino-mocks rhino partial-mocks


    【解决方案1】:

    这是第一次测试 没有工作(其他 45 个左右是 很好),但这也是第一个 使用 A) 部分模拟,和 B) a 返回 void 的模拟方法。任何 想法?

    A) PartialMock 意味着 Rhino 将拦截方法调用如果它对它有期望。我认为你在这里的用法很好。

    B) void 方法也不应该是个问题。

    很可能,您的问题出在您的预料之中:

    Expect.Call(delegate { contextManager.RemoveContext(guid); });
    

    您期望中的guid 需要与target 传入的guid 相同。

    试试这个:

    Expect.Call(delegate { contextManager.RemoveContext(guid); }).IgnoreArguments();
    
    // you can also use fluent syntax like this:
    // contextManager.Expect(x => x.RemoveContext(guid)).IgnoreArguments();
    

    如果它有效,您可以相当确定您的测试 guid 和课堂中使用的实际 guid 不匹配。

    【讨论】:

    • 已经试过了。甚至将其更改为返回一些东西,因此它不是无效的。我认为 contextManager (传递给 PartialMock 方法)没有与代理实例相关联。我将创建一个属性并显式设置它以查看是否可以解决它。
    • 事实证明,即使我传递了 null 并表示忽略参数(采用 Guid 的重载已注册为预期方法),也会调用采用字符串的重载。本质上你是对的朱丽叶。我应该更仔细地检查这两个参数中的参数,以注意传递的是字符串而不是 Guid。答案交给你。
    猜你喜欢
    • 1970-01-01
    • 2011-12-31
    • 2013-09-30
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多