2011-02-09 88 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