我是單元測驗和模擬資料庫的新手。我的一項測驗應該有效,但是當我正在測驗的模塊訪問 InMemoryDatabase 時,它??回傳 null 而不是用戶物件。
我正在使用最小起訂量和 xUnit。
我的測驗設定:
// Mock List of Db users
private List<User> GetFakeUsers()
{
List<User> output = new List<User> {
new User { Id = 1, Email = "[email protected]", Username = "admin_test", PasswordHash = System.Text.Encoding.UTF8.GetBytes("fgftfhstafgsrstf54"), Role = "admin" },
new User { Id = 2, Email = "[email protected]", Username = "user2", PasswordHash = System.Text.Encoding.UTF8.GetBytes("fgftfhstafgsrstf54"), Role = "premium" },
new User { Id = 3, Email = "[email protected]", Username = "user3", PasswordHash = System.Text.Encoding.UTF8.GetBytes("fgftfhstafgsrstf54"), Role = "basic" },
};
return output;
}
// Set up the InMemory Mock Database
private DataContext GetInMemoryMockDB()
{
// Set Up Entity InMemory Database
// I'm using the same DataContext as in the main program.
var options = new DbContextOptionsBuilder<DataContext>()
.UseInMemoryDatabase(databaseName: "UserServiceMockDb")
.Options;
// Set Up Mock AppSettings.json file
// Our DataContext.cs has two parameters in its constructor a dbContext and an IConfiguration it uses to read the appsettings.json file.
var config = new ConfigurationBuilder()
.SetBasePath(@"...blahblahblah...")
.AddJsonFile("mockAppSettings.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables();
_configuration = config.Build();
var dbContext = new DataContext(options, _configuration);
dbContext.Database.EnsureCreated();
dbContext.Users.AddRange(GetFakeUsers()); // Add our test users to the database
return dbContext;
}
我的單元測驗:
// Test - Check normal successful input. Get user3.
[Fact]
public async void GetUserByUsername_Works()
{
using (var mock = AutoMock.GetLoose())
{
// Arrange
// The module needs a few dependencies injected into its constructor...
var mapperCfg = new MapperConfiguration(m => { m.AddProfile<API_Project.AutoMapperProfile>(); });
IMapper mapper = mapperCfg.CreateMapper();
var databaseContext = GetInMemoryMockDB();
var loggerMock = new Mock<ILogger<UserService>>();
var mockHttpContextAccessor = new Mock<IHttpContextAccessor>();
// We have to supply an "admin" role claim
mockHttpContextAccessor.Setup(x => x.HttpContext.User.FindFirst(It.IsAny<string>())).Returns(new Claim("role", "admin"));
var suppliedUserList = GetFakeUsers();
// Act
var userService = new UserService(mapper, databaseContext, loggerMock.Object, mockHttpContextAccessor.Object);
ServiceResponse<GetUserDto> returnedUser = await userService.GetUserByUsername("user3"); // Lookup username "user3"
//Assert
// Compare supplied user3 to the returned user.
Assert.Equal(suppliedUserList[2].Email, returnedUser.Data.Email);
Assert.Equal(suppliedUserList[2].Username, returnedUser.Data.Username);
Assert.Equal(suppliedUserList[2].Role, returnedUser.Data.Role);
}
}
最后,我要測驗的單元:
public async Task<ServiceResponse<GetUserDto>> GetUserByUsername(string username)
{
var serviceResponse = new ServiceResponse<GetUserDto>();
// Get user by USERNAME from the database
// Check if the user role is "admin" ? [true] Lookup the specified user Id : [false] return only their user info
// This is returning NULL for the username search?
var dbUser =
GetUserRole().Equals("admin") ?
await _context.Users.FirstOrDefaultAsync(c => c.Username.Contains(username)) :
await _context.Users.Where(u => u.Id == GetUserId()).FirstOrDefaultAsync();
// FirstOrDefault() returns null if nothing is found.
if (dbUser != null)
{
serviceResponse.Data = _mapper.Map<GetUserDto>(dbUser);
}
else
{
// Send a message to tell user of the error
serviceResponse.Success = false;
serviceResponse.Message = "Sorry, we couldn't find that user.";
_logger.LogInformation("Error - Search for an unknown user. UserService.GetUserByUsername - USERNAME: {1}", username);
}
return serviceResponse;
}
問題是我正在測驗的上述模塊中的“var dbUser”回傳空值。它適用于我的生產資料庫,但不適用于 InMemoryDatabase。我猜它不能處理 linq 查詢什么的?
這是我第一次使用 InMemoryDatabases,所以我真的不知道它們的限制。我希望這不是由于拼寫錯誤或其他原因...
uj5u.com熱心網友回復:
我沒有.SaveChanges()在顯示的代碼中看到,我想除錯會在您的測驗資料庫中顯示未提交的更改。所以我會說在添加用戶之后添加它是值得的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/494265.html
