Witam mam pewien problem, ponieważ od niedawna uczę się jak pisać testy i napotkałem na pewien problem, którego nie jestem w stanie rozwiązać.
Chodzi mi dokładnie o to, że napisałem test, który ma sprawdzać, czy Kontroler, który jest odpowiedzialny za logowanie ma zwracać kod 200, czyli Ok jednak podczas wykonywania testu jest zwracany kod 500, czyli błąd serwera.
Używam bazy, która ładuję się do pamięci i wydaje mi się, że to prawdopodobnie z tym jest problem, ponieważ gdy robiłem test na normalnej bazie danych to test przechodził pomyślnie.
Poniżej wklejam kod, abyście mogli sprawdzić co może być nie tak.
AccountControllerTests:
public class AccountControllerTests : IClassFixture<WebApplicationFactory<Program>>
{
private HttpClient Client { get; set; }
public AccountControllerTests(WebApplicationFactory<Program> factory)
{
Client = factory
.WithWebHostBuilder(builder =>
{
builder.ConfigureServices(services =>
{
var dbContext = services
.SingleOrDefault(x => x.ServiceType == typeof(DbContextOptions<DiaryDbContext>));
services.Remove(dbContext);
services.AddDbContext<DiaryDbContext>(options => options.UseInMemoryDatabase("DiaryDb"));
});
})
.CreateClient();
}
[Fact]
public async Task Login_WithoutParams_ReturnOkRequest()
{
var model = new LoginViewModel()
{
Email = "user@user.com",
Password = "user"
};
var json = JsonConvert.SerializeObject(model);
var httpContext = new StringContent(json, Encoding.UTF8, "application/json");
var response = await Client.PostAsync("/api/Account/Login", httpContext);
response.StatusCode.Should().Be(System.Net.HttpStatusCode.OK);
}
}
AccountController:
public class AccountController : ControllerBase
{
private readonly AccountService AccountService;
public AccountController(AccountService AccountService)
{
this.AccountService = AccountService;
}
[HttpPost]
[Route("Register")]
public async Task<IActionResult> Register(LoginViewModel model)
{
await AccountService.Register(model);
return Ok();
}
[HttpPost]
[Route("Login")]
public async Task<IActionResult> Login(LoginViewModel model)
{
var token = await AccountService.Login(model);
return Ok(token);
}
}
AccountService:
public async Task<string> Login(LoginViewModel UserModel)
{
if (UserModel is null)
{
throw new ArgumentNullException("Invalid data");
}
var User = await DiaryDbContext.Person
.Include(x => x.Roles)
.ThenInclude(x => x.Role)
.SingleOrDefaultAsync(x => x.Email == UserModel.Email);
if (User is null)
{
throw new ArgumentNullException("Invalid data");
}
var Password = PasswordHasher.VerifyHashedPassword(UserModel, User.PasswordHash, UserModel.Password);
if (Password == PasswordVerificationResult.Failed)
{
throw new ArgumentOutOfRangeException("Invalid email or password");
}
var claims = new List<Claim>()
{
new Claim(ClaimTypes.NameIdentifier, User.UserUUID.ToString()),
new Claim(ClaimTypes.Name, User.Email)
};
foreach (var role in User.Roles)
{
claims.Add(new Claim(ClaimTypes.Role, role.Role.Name));
}
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Auth.Key));
var cred = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var expires = DateTime.Now.AddHours(10);
var token = new JwtSecurityToken(Auth.Issuer,
Auth.Issuer,
claims,
expires: expires,
signingCredentials: cred);
var tokenHandler = new JwtSecurityTokenHandler();
return tokenHandler.WriteToken(token);
}