I use UnitOfWork with repository in WebAPI dotnet 6 and want to use XUnit for test
I use below code but when run the test the result is:
System.NullReferenceException : Object reference not set to an instance of an object.
What I have tried:
public interface IUnitOfWork : IDisposable
{
IUserRepository UserRepository { get; }
}
public class UnitOfWork : IUnitOfWork
{
protected readonly DatabaseContext db;
private IUserRepository userRepository;
public IUserRepository UserRepository
{
get
{
if (userRepository == null)
{
userRepository = new UserRepository(db);
}
return userRepository;
}
}
}
public interface IUserRepository : IGenericRepository<UserRole>
{
Task<User> GetUserWithRolesAsync(string username);
}
public class UserRepository : GenericRepository<User>, IUserRepository
{
public async Task<User> GetUserWithRolesAsync(string username)
{
}
}
private readonly IUnitOfWork _uow;
public AuthController(IUnitOfWork uow) : base(uow)
{
_uow = uow;
}
[HttpPost("authenticate")]
public async Task<IActionResult> Authenticate([FromBody] UserLoginViewModel Request)
{
User user = await _uow.UserRepository.GetUserWithRolesAsync(Request.Username);
}
[Fact]
public async Task Authenticate_WithInvalidUsernamePassword_ReturnsNotFound()
{
var unitOfWorkStub = new Mock<IUnitOfWork>();
unitOfWorkStub.Setup(uow => uow.UserRepository.GetUserWithRolesAsync(It.IsAny<string>())).ReturnsAsync((User)null);
var jwtAuthenticatorManagerStub = new Mock<IJwtAuthenticatorManager>();
var localizorStub = new Mock<IStringLocalizer<SharedTranslate>>();
var controller = new AuthController(unitOfWorkStub.Object, localizorStub.Object, jwtAuthenticatorManagerStub.Object);
UserLoginViewModel userLoginViewModel = new UserLoginViewModel
{
Username = "admin",
Password = "admin@123"
};
var result = await controller.Authenticate(userLoginViewModel);
Assert.IsType<NotFoundResult>(result);
}