4
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;

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

感谢您的帮助

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

4

4 回答 4

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));
        }
    }
}

我只能猜测您在混淆代码的方式上做错了什么。

于 2009-02-26T21:47:46.277 回答
1

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

于 2009-03-02T09:31:20.303 回答
0

我对 Rhino Mocks 不熟悉,但我可以告诉你如何使用 NUnit 的内置模拟库 NUnit.Mocks 来做到这一点:

列表名称 = 新列表 {"Test", "Test1"};

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

mockView.ExpectAndReturn("get_Names", names);

IView 视图 = (IView)mockView.MockInstance;

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

于 2009-02-27T14:18:57.237 回答
0

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

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

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

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

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

于 2009-03-09T09:45:50.117 回答