Cześć,
mam problem z ogarnięciem testów jednostkowych. Być może moje podejście w ogóle jest błędne, więc prosiłbym o nakierowanie na właściwą drogę
Mam klasę, która w założeniu ma służyć m.in. do zakładania konta dla nowego użytkownika:
public class AccountService : IAccountService
{
private readonly DbContext _dbContext;
private readonly IMapper _mapper;
private readonly IPasswordHasher<User> _passwordHasher;
private readonly JwtConfig _jwt;
public AccountService(DbContext dbContext, IMapper mapper, IPasswordHasher<User> passwordHasher, IOptionsMonitor<Jwt> optionsMonitor)
{
_dbContext = dbContext;
_mapper = mapper;
_passwordHasher = passwordHasher;
_jwt = optionsMonitor.CurrentValue;
}
public async Task CreateAccount(CreateAccountDto dto)
{
[cała logika, np. mapowanie z dto czy hashowanie hasła]
_dbContext.Users.Add(user);
await _dbContext.SaveChangesAsync();
}
}
I teraz chciałem wykonać test jednostkowy. Na ten moment mam to:
[Fact]
public async Task CreateAccount_ForValidData_InvokeSaveChangesAsync()
{
//arrange
var systemDbContextMock = new Mock<SystemDbContext>();
systemDbContextMock.Setup(x => x.Users.Add(new User() { Name = "", Email = "", PasswordHash = "" })).Returns((EntityEntry<User> u) => u);
var mapperMock = new Mock<IMapper>();
var passwordHasherMock = new Mock<IPasswordHasher<User>>();
var jwtMock = new Mock<IOptionsMonitor<JwtConfig>>();
var accountService = new AccountService(systemDbContextMock.Object, mapperMock.Object, passwordHasherMock.Object, jwtMock.Object);
//act
await accountService.CreateAccount(new CreateAccountDto() { Name = "", Email = "", Password = "" });
//assert
systemDbContextMock.Verify(m => m.SaveChangesAsync(It.IsAny<CancellationToken>()), Times.Once());
}
Czyli w założeniu test powinien zakończyć się powodzeniem jeżeli zostanie wywołana metoda SaveChangesAsync.
Przy uruchomieniu testu mam jednak komunikat:
Message:
System.NotSupportedException : Specified method is not supported.
Stack Trace:
IQueryable.get_Provider()
Queryable.Any[TSource](IQueryable`1 source, Expression`1 predicate)
AccountService.CreateAccount(CreateAccountDto dto)
AccountServiceUnitTest.CreateAccount_ForValidData_InvokeSaveChangesAsync()
Będę wdzięczny za wskazówki jak prawidło napisać taki test.