当前位置:  开发笔记 > 编程语言 > 正文

Rhino Mocks:为存根上的方法重新分配新结果

如何解决《RhinoMocks:为存根上的方法重新分配新结果》经验,为你挑选了1个好方法。

我知道我可以这样做:

IDateTimeFactory dtf = MockRepository.GenerateStub();
dtf.Now = new DateTime();
DoStuff(dtf); // dtf.Now can be called arbitrary number of times, will always return the same value
dtf.Now = new DateTime()+new TimeSpan(0,1,0);  // 1 minute later
DoStuff(dtf); //ditto from above

如果不是IDateTimeFactory.Now是一个属性它是一个方法IDateTimeFactory.GetNow(),我怎么做同样的事情呢?

根据Judah的建议,我已经重写了我的SetDateTime辅助方法,如下所示:

    private void SetDateTime(DateTime dt) {
        Expect.Call(_now_factory.GetNow()).Repeat.Any();
        LastCall.Do((Func)delegate() { return dt; });
    }

但它仍然会抛出"ICurrentDateTimeFactory.GetNow();的结果已经设置好了." 错误.

加上它仍然无法使用存根....



1> David Tchepa..:

我知道这是一个老问题,但我想我会发布更新的Rhino Mocks版本的更新.

基于之前使用Do()的答案,如果您在Rhino Mocks中使用AAA(可从3.5+版本获得),则可以使用稍微清洁(IMO)的方式.

    [Test]
    public void TestDoStuff()
    {
        var now = DateTime.Now;
        var dtf = MockRepository.GenerateStub();
        dtf
           .Stub(x => x.GetNow())
           .Return(default(DateTime)) //need to set a dummy return value
           .WhenCalled(x => x.ReturnValue = now); //close over the now variable

        DoStuff(dtf); // dtf.Now can be called arbitrary number of times, will always return the same value
        now = now + new TimeSpan(0, 1, 0); // 1 minute later
        DoStuff(dtf); //ditto from above
    }

    private void DoStuff(IDateTimeFactory dtf)
    {
        Console.WriteLine(dtf.GetNow());
    }

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有