2011-02-09 18 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に注入してから、ObjectFactoryを使わずにFooのインスタンスを作成しています。

私はあなたの意図だったと思う:

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

うん、ありがとう!私は複雑なシナリオでこの問題を抱えていました。私は些細なシナリオでそれを再現しようとしましたが、私はまったく困惑していました。時には私の再生がダムであることを私に伝えるために別の目を必要とすることもあります。あなたの目のためにありがとう! – Jaxidian