2009-02-26 75 views
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; 

當我用上面的代碼返回名稱的列表模擬,它不匹配,則expecatation返回null,未能如何嘲笑返回列表對象的屬性 - 在犀牛模擬

感謝您的幫助

編輯: 我傳遞視圖作爲演示者的GetNames方法的參數。問題是當我從mocked屬性返回列表對象時,它返回null。然而,當我將屬性數據類型更改爲字符串/ int即重複類型然後值正確返回

+0

「不適合我」不是一個有用的錯誤報告。請說出它在做什麼,爲什麼這不是你想要的。 – 2009-02-26 16:01:43

+0

嗨jon, 我按照你的建議編輯了這個問題 – scorpio 2009-02-26 16:25:36

回答

1

感謝您的幫助,在調查後發現我在主持人內部使用相同內容的視圖列表對象創建了一個新的列表對象,並因此而失敗。 現在我使用屬性約束來匹配期望中的參數並且它可以工作! 感謝所有

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

我只能猜測你在混淆代碼的方式上做錯了什麼。

+0

Chris,謝謝你的回答,但我將視圖作爲主講者的GetNames方法的參數。這裏的問題是,當我從模擬屬性返回列表對象返回null。然而,當我將屬性數據類型更改爲字符串/ int iepremitive類型然後值正確返回 – scorpio 2009-02-27 09:39:25

0

我不熟悉的犀牛嘲笑,但我可以告訴你如何與NUnit的內置的模擬庫,NUnit.Mocks要做到這一點:

列表名稱=新列表{「測試」,「測試1」 };

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

mockView.ExpectAndReturn(「get_Names」,names);

IView view =(IView)mockView.MockInstance;

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

0

有一件事你不應該忘記(我知道我做到了,它讓我迷惑):指定要多少次的期望工作 - 否則,如果你的代碼使用屬性不止一次,你將得到奇怪的結果,因爲期望

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

只適用於單一呼叫。所以,如果你的嘲笑財產應該每次它被稱爲時間返回相同的東西,你應該寫

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