2016-09-14 10 views
0

Moq.4.2.1507.0118を使用しています。以前は見たことがない問題があります。状況は、私のモデル(AとB)に1対多の関係を持つ2つのクラスがあることです。例:MoqがICollectionリファレンスを解決しない

[Table("A")] 
public partial class A 
{ 

    public A() 
    { 
     this.theB = new HashSet<B>(); 
    } 

    [Key] 
    public int AId{ get; set; } 
    public string Name{ get; set; } 

    public virtual ICollection<B> theB{ get; set; } 

} 

[Table("B")] 
public partial class B 
{ 
    [Key] 
    public int BId{ get; set; } 
    public int AId{ get; set; } 
    public virtual A theA { get; set; } 
} 

もちろんDbContextにはDbSetが定義されています。

その後、私のテストコードでは、私が持っている:

[TestMethod] 
    public void SomeTest() 
    { 
     var theAs = new List<A> 
     { 
      new A{ AId=1, Name="test" } 
     }; 
     var theBs= new List<B> 
     { 
      new B{ BId=1, AId=1, theA=theAs[0] } 
     }; 

     var ASet= new Mock<DbSet<A>>().SetupData(theAs); 
     var BSet= new Mock<DbSet<B>>().SetupData(theBs); 

     var context = new Mock<MyContext>(); 
     context.Setup(s => s.A).Returns(ASet.Object); 
     context.Setup(s => s.B).Returns(BSet.Object); 

     var m = new ClassThatImTesting(context); 
     m.someMethod("test"); 
    } 

は、通常、私は、これはAとBはモックコンテキスト内で互いに知らせるために十分であることがわかります。しかし、私がテストしているメソッドで、次のようなものを実行すると、

var result = context.A.Where(x => x.theB.Count() > 0).FirstOrDefault(); 

nullが返されます。他の多くのテストで問題なくこれをやったので、私はこの問題を解決するために何をしたのか分かりません。どんなアイデアも参考になるでしょう!私はこの例を実際のコードから単純化しました。したがって、構文エラーを許してください。

+0

これとは別に、このようなdbcontextをテストする代わりに(汎用ではない)リポジトリパターンを使用する価値があります。 dbコンテキストが動作することを信頼する必要があります。 –

+2

「theB」をオブジェクト「theAs」にインスタンス化しているところがわかりません – raven

+0

@RobertoDeLaParra - あなたは:theAs [0] .theB = theBs ;?を意味します。私はそれを試みたが、それは助けにはならなかった。また、私は以前にそれを行う必要はなかった。 –

答えて

0

クラスにコンテキストを挿入する前に、コレクションをAオブジェクトにインスタンス化する必要があります。

[TestMethod] 
    public void SomeTest() 
    { 
     var theAs = new List<A> 
     { 
      new A{ AId=1, Name="test" } 
     }; 
     var theBs= new List<B> 
     { 
      new B{ BId=1, AId=1, theA=theAs[0] } 
     }; 
     //here 
     theAs[0].theB = theBs 

     var ASet= new Mock<DbSet<A>>().SetupData(theAs); 
     var BSet= new Mock<DbSet<B>>().SetupData(theBs); 

     var context = new Mock<MyContext>(); 
     context.Setup(s => s.A).Returns(ASet.Object); 
     context.Setup(s => s.B).Returns(BSet.Object); 

     var m = new ClassThatImTesting(context); 
     m.someMethod("test"); 
    } 
+0

盲目にしてくれてありがとう:) –

関連する問題