簡體   English   中英

如何模擬返回列表對象的屬性 - 在rhino mock中

[英]How to mock the property which returns the list object - In rhino mock

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屬性返回列表對象時,它返回null。 但是,當我將屬性數據類型更改為string / int iepremitive類型時,將正確返回值

我沒有看到你的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));
        }
    }
}

我只能猜測你混淆代碼的方式有問題。

感謝您的幫助,經過調查我發現我在演示者中創建了一個新的列表對象,其中包含相同的視圖列表對象內容,因此它失敗了。 現在我使用屬性約束來匹配期望中的參數,它工作了!! 謝謝大家

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

如果你的模擬屬性應該在每次被調用時返回相同的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM