我在projet中使用EF Core来获取存储过程调用。就我而言,我有以下内容:
public class MyContext : DbContext
{
public DbQuery<User> UserQuery { get; set; }
public MyContext(DbContextOptions<MyContext> options) : base(options) { }
}
我这样调用存储过程:
public virtual async Task<User> GetUserAsync(string name)
{
return await MyContext.Query<User>()
.FromSql($"EXEC [dbo].[GetUser], @Login = {name}")
.FirstOrDefaultAsync();
}
代码工作正常。我需要在单元测试中测试此方法,我正在使用InMemoryDatabase像这样模拟上下文MyContext:
[Fact]
public async Task GetUserAsync_should_return_first_user_with_login_and_password_if_exists()
{
// Arrange
var users = new List<User>
{
new User()
{
Login = "test@outlook.fr",
Password = "pass1",
},
};
var options = new DbContextOptionsBuilder<MyContext>()
.UseInMemoryDatabase(databaseName: "BddName")
.Options;
var context = new MyContext(options);
var loginProvider = A.Fake<LoginProvider>(opts => opts.WithArgumentsForConstructor(() => new LoginProvider(context)));
// Act
// Assert
context.Dispose();
}
我不知道如何将列表设置为从DbQuery调用的存储过程的结果。我试图遵循本文:https://nodogmablog.bryanhogan.net/2017/11/unit-testing-entity-framework-core-stored-procedures/,但它仅适用于DbSet,不适用于DbQuery。 对于这种情况,我需要一些建议。
谢谢。
答案 0 :(得分:0)
OP中的链接确实也适用于DbQuery类型,因为您在嘲笑提供程序。在这方面,DbSet和DbQuery的工作方式相同。
有关该主题的先前答案,请参见https://stackoverflow.com/a/56940311/2975810。