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类型时,则正确返回值
答案 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();
如果你的模拟属性应该在每次被调用时返回相同的内容。