私は単体テストを書かれたメソッドにしようとしていますが、私は問題に直面しています。ここでUnityとNUnit
は私のUnityConfigクラスです:
public class UnityConfig
{
#region Unity Container
private static Lazy<IUnityContainer> container = new Lazy<IUnityContainer>(() =>
{
var container = new UnityContainer();
RegisterTypes(container);
return container;
});
public static IUnityContainer GetConfiguredContainer()
{
return container.Value;
}
#endregion
public static void RegisterTypes(IUnityContainer container)
{
container.RegisterInstance(AutoMapperConfig.Initialize());
container.RegisterType<IActiveDirectoryUserService, ActiveDirectoryUserService>();
container.RegisterType<IUserRepository, InMemoryUserRepository>();
container.RegisterType<IUserService, UserService>();
}
}
テスト済みの方法:
public async Task RegisterAsync(string name, string email, string firstName, string lastName, string password)
{
var user = await _userRepository.GetBynameAsync(name);
if (user != null)
{
throw new Exception($"User {name} already exists.");
}
else
{
var ActiveDirectoryUser = await _ActiveDirectoryUserService.GetBynameAsync(name);
if (ActiveDirectoryUser == null)
{
throw new Exception($"User {name} does not exist in Active Directory");
}
else
{
var salt = new Guid().ToString("N");
user = new User(name, ActiveDirectoryUser.Email, ActiveDirectoryUser.FirstName, ActiveDirectoryUser.LastName, password, salt);
await _userRepository.AddAsync(user);
}
}
}
試験方法:
[Test]
public async Task Test()
{
var userRepositoryMock = new Mock<IUserRepository>();
var activeDirectoryUserMock = new Mock<IactiveDirectoryUserService>();
var mapperMock = new Mock<IMapper>();
var userService = new UserService(userRepositoryMock.Object, activeDirectoryUserMock.Object, mapperMock.Object);
await userService.RegisterAsync("name", "[email protected]", "first name", "last name", "password");
userRepositoryMock.Verify(x => x.AddAsync(It.IsAny<User>()), Times.Once);
}
テストされた方法は、細かい外テストに動作しますが、私は、テストを実行すると、それが失敗しました。私は、デバッグモードでテストを実行し、私はそれが
var user = await _userRepository.GetBynameAsync(name);
var ActiveDirectoryUser = await _ActiveDirectoryUserService.GetBynameAsync(name);
にそれがテスト中に、これらの方法に入らない理由を任意のアイデアを入力していないことがわかりましたか? UnityConfigにいくつかのエントリを追加して動作させる必要がありますか?
- 何が起こっているEDIT
private static ISet<User> _users = new HashSet<User>
{
new User("user1", "[email protected]", "firstnam1", "lastname1", "pass", "salt"),
new User("user2", "[email protected]", "firstnam2", "lastname2", "pass", "salt"),
new User("user3", "[email protected]", "firstnam3", "lastname3", "pass", "salt")
};
public async Task<IEnumerable<User>> GetAllAsync()
=> await Task.FromResult(_users);
ありがとうございました。仮定したインターフェースはmintと同じように見えます。私は2つのことを理解していません。 userRepositoryMockの場合、なぜあなたはAddAsyncメソッドを呼び出していますか?また、なぜadUserMockのために偽のアカウントを作成しましたか?私はより穏やかな方法でテストを書くことができるように非同期呼び出しをサポートする他のライブラリはありますか? – ironcurtain
@ironcurtain 'AddAsync'は' Task'を返します。あなたがそれを設定しなければ、モックは何も返さず、テスト中のメソッドは完了まで流れません。 – Nkosi
@ironcurtain他の依存関係も同じです。正しく設定されていませんでした。テストでは、依存関係が擬似されているため、テスト中のメソッドを具体的な実装を使用することによって発生する可能性のあるノックオン効果なしに単独でテストできます。テストされるメソッドも非同期であるため、テストを配置するときに考慮する必要があります。 – Nkosi