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

Interface IView { List Names {get; set;} } public class Presenter { public List GetNames(IView view) { return view.Names; } } var mockView = MockRepository.GenerateMock(); var presenter = new Presenter(); var names = new List {"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属性返回列表对象时,它返回null。 但是,当我将属性数据类型更改为string / int iepremitive类型时,则正确返回值

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

 presenter.View = view; 

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

 using System.Collections.Generic; namespace Tests { public interface IView { List Names { get; set; } } public class Presenter { public List 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(); var presenter = new Presenter(); var names = new List {"Test", "Test1"}; mockView.Expect(v => v.Names).Return(names); Assert.AreEqual(names, presenter.GetNames(mockView)); } } } 

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

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

我不熟悉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));

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

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

仅适用于单个呼叫。 所以你应该写

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

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