2017-04-12 183 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()並像往常一樣聲明結果。

這裏是我如何使用Moq的接口,例如repo接口;

// 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

這沒有意義,因爲我嘲笑傳遞給服務的上下文,它定義了服務行爲 –