2017-04-12 8 views
0

私は、次のコードでFindAsyncを嘲笑:モッキングFindAsync方法

var brands = new Mock<DbSet<Brand>>(); 
     ConfigureTheDbSet(brands, brandData); 
     brands.Setup(b => b.FindAsync(It.IsAny<object[]>())) //substitution of the .SelectAsync(id) method 
      .Returns<object[]>(ids => brands.Object.FirstOrDefaultAsync(b => b.BrandId == (int) ids[0])); 

と私はコンテキストにAsNoTrackingためにモックを追加するまで、それが正常に働いていた:

var mockContext = new Mock<ReportDbContext>(); 
     mockContext.Setup(m => m.Set<Brand>()).Returns(brands.Object); 
     mockContext.Setup(m => m.Set<Brand>().AsNoTracking()).Returns(brands.Object); 

そしてFindAsyncはnullを返します。

mockContext.Setup(m => m.Set<Brand>().FindAsync(It.IsAny<object[]>())) 
      .Returns<object[]>(async d => await brands.Object.FindAsync(d)); 

誰もがなぜこれが起こっているの手掛かりを持っている:それは私には、次のモックを追加した動作するように?

答えて

0

IMOの場合は、IBrandRepositoryなどのインターフェイスをモックする必要があります。そうでなければ、嘲笑の点は何ですか? - あなたはクラスのインスタンスを作成し、FindAsync()を呼び出していつものように結果をアサートすることができます。

ここで私はMoopをインタフェースで使っています。

// arrange 
var mockRepo = new Mock<IBrandRepository>(); 
mockRepo.Setup(o => o.FindAsync(It.IsAny<string>())).ReturnsAsync(new Brand[] { ... }); 

var someClass = new SomeClass(IBrandRepository); // someClass that use IBrandRepository 

// act 
string search = "brand1 brand2"; // what the user searches for 
var results = someClass.FindBrands(searchText) // internally calls IBrandRepository.FindAsync() 

// assert 
// Assert.AreEqual(results.Count(), ... 
+0

サービスに渡されるコンテキストを模倣し、サービスの動作を定義するため意味がありません –

関連する問題