Xunit-und Mock-Daten mit Moq
Ich bin neu in unit-Tests, kann mir jemand beraten, wie Sie testen die öffentliche Methode (CreateUser -) unten mit xUnit und Moq, danke!
public async Task<bool> CreateUser(UserDTO newUser)
{
newUser.CustomerId = _userResolverService.GetCustomerId();
if (await CheckUserExists(newUser)) return false;
var salt = GenerateSalt(10);
var passwordHash = GenerateHash(newUser.Password, salt);
await _usersRepository.AddAsync(new User()
{
Role = newUser.Role,
CretedOn = DateTime.Now,
CustomerId = newUser.CustomerId,
Email = newUser.Email,
FirstName = newUser.FirstName,
LastName = newUser.LastName,
PasswordHash = passwordHash,
Salt = salt,
UpdatedOn = DateTime.Now
});
return true;
}
Private folgenden Methoden
Überprüfen Sie, ob Benutzer vorhanden ist gibt einfach die Anzahl der bestehenden Benutzer
private async Task<bool> CheckUserExists(UserDTO user)
{
var users = await _usersRepository.GetAllAsync();
var userCount = users.Count(u => u.Email == user.Email);
return userCount > 0;
}
Hash-Generation
private static string GenerateHash(string input, string salt)
{
var bytes = System.Text.Encoding.UTF8.GetBytes(input + salt);
var sha256 = SHA256.Create();
var hash = sha256.ComputeHash(bytes);
return ByteArrayToString(hash);
}
Salz Generaion
private static string GenerateSalt(int size)
{
var rng = RandomNumberGenerator.Create();
var buff = new byte[size];
rng.GetBytes(buff);
return Convert.ToBase64String(buff);
}
private static string ByteArrayToString(byte[] ba)
{
var hex = new StringBuilder(ba.Length * 2);
foreach (byte b in ba)
hex.AppendFormat("{0:x2}", b);
return hex.ToString();
}
Dank,
J
EDIT 1
Dies ist, was ich habe, so weit:
[Fact]
public async void CreateUser_True()
{
//arrange
var dataSource = new Mock<IRepository<User, int>>();
var userResolverService = new Mock<IUserResolverService>();
var tokenService = new Mock<ITokenService>();
var users = new List<User>();
users.Add(new User()
{
Email = "[email protected]",
CustomerId = 1
});
dataSource.Setup(m => m.GetAllAsync()).ReturnsAsync(users); //Error Here with converting async task to IEnumerable...
var accountService = new AccountService(dataSource.Object,userResolverService.Object,tokenService.Object);
//act
//assert
}
Hauptproblem ist, dass ich keine Ahnung habe, wie Mock, set-up Verhalten der privaten Methode "CheckUserExists", wie ihn die Berufung IRepository, welches verspottet wird für die Klasse, so wird diese in diesem Fall die Rücksendung meiner mock-setup für GetAllAsync von dieser privaten Methode ist?
EDIT 2
public async Task<TEntity> AddAsync(TEntity entity)
{
if (entity == null)
{
throw new ArgumentNullException(nameof(entity));
}
_entities.Add(entity);
await _context.SaveChangesAsync();
return entity;
}
EDIT 3
[Fact]
public async void CreateUser_True()
{
//arrange
var users = new List<User>();
users.Add(new User()
{
Email = "[email protected]",
CustomerId = 1
});
_dataSource.Setup(m => m.GetAllAsync()).ReturnsAsync(users);
_dataSource.Setup(m => m.AddAsync(It.IsAny<User>())).Returns<User>(Task.FromResult);
var accountService = new AccountService(_dataSource.Object, _userResolverService.Object, _tokenService.Object);
//act
var result = await accountService.CreateUser(new UserDTO()
{
Email = "[email protected]"
});
var updatedUsersList = await _dataSource.Object.GetAllAsync();
var usersCount = updatedUsersList.Count();
//assert
Assert.True(result);
Assert.Equal(2, usersCount);
}
_userResolverService
hat eine Schnittstelle implementieren, so können Sie mock-Aufrufe, zB:var _userResolverService = new IuserResolverService(); var controller = new userResolverServiceController(IuserResolverService.Object); IuserResolverService.SetUp(r => r.GetCustomerId). Returns (123);
Folgt ein einfaches Beispiel, es gibt Hunderte online.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als die Methode, die getestet wird, async, müssen Sie setup alle asynchronen Abhängigkeiten zu erlauben, die Methode Fluss bis zur Fertigstellung. Für die private Methode, die Sie einrichten möchten, das Verhalten von Abhängigkeiten, die verwendet werden, innerhalb der Methode, in diesem Fall ist die Benutzer-repository.
Lesen, auf Moq Quickstart, um besser zu verstehen, wie das mocking framework.