好吧,我快疯了。我已经使用DbSet.Where's 1000次了,但不管什么原因,它在这个特定的xunit测试中不能工作。问题的根源似乎在于我的where语句试图获得recipeid's=1的列表,以便我可以删除它们。当我停止代码并查看我的locals时,params在指定的地方被设置为1,但where却没有接收到它。
我把代码合并了一下,让它在这里更易读,但还是不能正常工作。我到底漏了什么?
[Fact]
public void DeleteIngredientListWithId_ReturnsProperCount()
{
//Arrange
var dbOptions = new DbContextOptionsBuilder<IngredientDbContext>()
.UseInMemoryDatabase(databaseName: $"IngredientDb{Guid.NewGuid()}")
.Options;
var sieveOptions = Options.Create(new SieveOptions());
var fakeIngredientOne = new Ingredient { RecipeId = 1 };
var fakeIngredientTwo = new Ingredient { RecipeId = 1 };
var fakeIngredientThree = new Ingredient { RecipeId = 2 };
//Act
using (var context = new IngredientDbContext(dbOptions))
{
context.Ingredients.AddRange(fakeIngredientOne, fakeIngredientTwo, fakeIngredientThree);
var service = new IngredientRepository(context, new SieveProcessor(sieveOptions));
var ingredients = context.Ingredients.Where(i => i.RecipeId == 1).ToList();
context.Ingredients.RemoveRange(ingredients);
context.SaveChanges();
//Assert
var ingredientList = context.Ingredients.ToList();
ingredientList.Should().ContainEquivalentOf(fakeIngredientThree);
ingredientList.Should().HaveCount(1);
context.Database.EnsureDeleted();
}
}
看起来你可能没有在随后尝试查询(然后删除它们)之前将添加到数据库的记录持久化。这个 Where
方法正在寻找数据库,而数据库是空的,直到你的 SaveChanges()
在你保存更改之前,待添加的内容可能在以下地方等着你 context.Ingredients.Local