如何模拟返回列表对象的属性 - 在rhino mock中

时间:2009-02-26 15:59:33

标签: c# mocking rhino-mocks

Interface IView
{
   List<string> Names {get; set;}
}

public class Presenter
{
   public List<string> GetNames(IView view)
   {
       return view.Names;
   }
}

var mockView = MockRepository.GenerateMock<IView>();
var presenter = new Presenter();
var names = new List<string> {"Test", "Test1"};

mockView.Expect(v => v.Names).Return(names);

Assert.AreEqual(names, presenter.GetNames(mockView)) // Here presenter returns null which is incorrect behaviour in my case;

当我使用上面的代码返回名称的模拟列表时,它与expecatation不匹配然后返回null并失败

感谢您的帮助

编辑: 我将视图作为演示者的GetNames方法的参数传递。这里的问题是当我从mocked属性返回list对象时它返回null。但是,当我将属性数据类型更改为string / int iepremitive类型时,则正确返回值

4 个答案:

答案 0 :(得分:3)

我没有看到你的mockView附加到你的演示者的任何地方。因此,从演示者的角度来看,视图为空。您可能需要执行以下操作:

presenter.View = view; 

我刚用NUnit和RhinoMocks 3.5编写了这个,以确保它有效。这是我的两个类文件。测试通过了。

using System.Collections.Generic;

namespace Tests
{
    public interface IView
    {
        List<string> Names { get; set; }
    }

    public class Presenter
    {
        public List<string> GetNames(IView view)
        {
            return view.Names;
        }
    }
}

using System.Collections.Generic;
using NUnit.Framework;
using Rhino.Mocks;

namespace Tests
{

    [TestFixture]
    public class TestFixture
    {
        [Test]
        public void TestForStackOverflow()
        {
            var mockView = MockRepository.GenerateMock<IView>();
            var presenter = new Presenter();
            var names = new List<string> {"Test", "Test1"};

            mockView.Expect(v => v.Names).Return(names);

            Assert.AreEqual(names, presenter.GetNames(mockView));
        }
    }
}

我只能猜测你混淆代码的方式有问题。

答案 1 :(得分:1)

感谢您的帮助,经过调查我发现我在演示者中创建了一个新的列表对象,其中包含相同的视图列表对象内容,因此它失败了。 现在我使用属性约束来匹配期望中的参数,它工作了!! 谢谢大家

答案 2 :(得分:0)

我不熟悉Rhino Mocks,但我可以告诉你如何使用NUnit的内置模拟库NUnit.Mocks:

列表名称=新列表{“测试”,“测试1”};

DynamicMock mockView = new DynamicMock(typeof(IView));

mockView.ExpectAndReturn(“get_Names”,姓名);

IView view =(IView)mockView.MockInstance;

Assert.AreEqual(names,presenter.GetNames(view));

答案 3 :(得分:0)

你不应该忘记的一件事(我知道我做了,这让我感到困惑):指定你希望工作的次数 - 否则,如果你的代码多次使用该属性,你会得到奇怪的结果,因为期望

mockView.Expect(v => v.Names).Return(names);

仅适用于一个电话。所以你应该写

mockView.Expect(v => v.Names).Return(names).Repeat.Any();

如果你的模拟属性应该在每次被调用时返回相同的内容。