2011-02-09 89 views
2

我正在努力應對Moq和StructureMap的一些非常基本的/概念性的問題。鑑於以下代碼,測試失敗。爲什麼?看起來,我的Numbers屬性上的模擬/注入功能只是被忽略,並且繼續調用原始功能。Moq/StructureMap基礎知識

[TestFixture] 
public class MockBasics 
{ 
    [SetUp] 
    public void SetUp() 
    { 
     var m = new Mock<Foo>(); 
     m.SetupGet(x => x.Numbers).Returns(() => new List<int> {1, 2, 3, 4, 5, 6}); 
     ObjectFactory.Inject(m.Object); 
    } 

    [Test] 
    public void DoTest() 
    { 
     var f = new Foo(); 

     Assert.IsTrue(f.Numbers.Contains(6)); 
    } 

    public class Foo 
    { 
     private IList<int> _numbers; 
     public virtual IList<int> Numbers 
     { 
      get { return _numbers; } 
      set { _numbers = value; } 
     } 

     public Foo() 
     { 
      //_numbers = new List<int> { 1, 2, 3, 4, 5, 6 }; // This passes the test 
      _numbers = new List<int> { 1, 2, 3, 4 }; 
     } 
    } 

    public class Bar 
    { 
     public IList<int> GetNumbers() 
     { 
      var x = ObjectFactory.GetInstance<Foo>(); 
      return x.Numbers; 
     } 
    } 
} 

回答

4

您的代碼不能連接點。您將Foo的模擬注入到ObjectFactory中,然後創建Foo的實例而不涉及ObjectFactory。

我想你的意圖是:

var b = new Bar(); 
Assert.IsTrue(b.GetNumbers.Contains(6)); 
+0

是啊,謝謝!我在一個複雜的場景中遇到了這個問題,我試圖在一個微不足道的場景中重現它,而我卻完全困惑不解。有時你只需要另一雙眼睛告訴我,我的再生產是愚蠢的。謝謝你的眼睛! – Jaxidian 2011-02-10 13:47:19