2013-07-30 30 views
0

我想測試一個數據訪問類。基本上,function1直接從DataContext讀取數據,另一個函數2添加過濾器。函數1和函數2可以在相同的類或繼承類。Rhino Mocks或者StructureMap AutoMocks如何在同一個/ Inherit類中存儲函數?

如何存取函數1的返回值和測試函數2?

示例代碼我到目前爲止,但它不起作用。我試圖使用Rhino Mocks和StructureMap Auto Mock,在存根時仍然出現錯誤。

任何幫助表示讚賞。非常感謝。

public class TestClass : ITestClass 
{ 
    private DbContext _context; 

    public IEnumerable<TestObject1> TestFunction1() 
    { 
     return _context.GetSomething(); 
    } 

    public TestObject2 TestFunction2() 
    { 
     return TestFunction1().Where(x=>x.Parent == null); 
    } 
} 
public interface ITestClass 
{ 
    IEnumerable<TestObject1> TestFunction1(); 
    TestObject2 TestFunction2(); 
} 
[Test] 
public void TestFunction2_Test() 
{ 
    var mock = MockRepository.GenerateMock<TestClass>(); 

    var test = new List<TestObject1>(); 

    mock.Stub(x=>x.TestFunction1()).Return(test); 

    var result = mock.TestFunction2(); 

    Assert.AreSame(1, result.Count()); 
} 

回答

2

你需要什麼才能使這個工作是「部分模擬」。 Rhino Mocks只能在執行部分模擬時存儲虛擬方法。如果你將TestFunction1標記爲virtual它應該可以工作。

此外,您應該使用Assert.AreEqual,因爲它檢查值是否相等(「對象是否等價?」)。 Assert.AreSame檢查引用是否相等(「它們是同一個對象嗎?」)。有關詳細說明,請參閱this answer

關於一般的部分模擬,應該避免。不得不執行部分模擬經常表明班級正試圖做太多。既可以將該函數作爲類的單元測試的一部分進行測試,也可以將其提取到單獨的合作類中。

+0

非常感謝您的評論,我昨晚進行了測試,使方法虛擬作品。感謝您指出AreSame問題。 –