c# – Xunit Assert中的异步lambda表达式.Throws
发布时间:2020-12-15 18:09:11 所属栏目:百科 来源:网络整理
导读:我有一些测试代码声明重复用户无法通过我的UserRepository创建. User.cs: public class User{ public int Id { get; set; } public string AccountAlias { get; set; } public string DisplayName { get; set; } public string Email { get; set; } public
我有一些测试代码声明重复用户无法通过我的UserRepository创建.
User.cs: public class User { public int Id { get; set; } public string AccountAlias { get; set; } public string DisplayName { get; set; } public string Email { get; set; } public bool IsActive { get; set; } } UserRepository.cs: public class UserRepository { public virtual async Task<User> CreateAsync(User entity) { if (entity == null) { throw new ArgumentNullException("entity"); } if (await GetDuplicateAsync(entity) != null) { throw new InvalidOperationException("This user already exists"); } return Create(entity); } public async Task<User> GetDuplicateAsync(User user) { if (user == null) { throw new ArgumentNullException("user"); } return await (from u in Users where u.AccountAlias == user.AccountAlias && u.Id != user.Id && u.IsActive select u).FirstOrDefaultAsync(); } } UserRepositoryTests.cs: public sealed class UserRepositoryTests : IDisposable { public UserRepositoryTests() { UserRepository = new UserRepository(new FooEntities()); // DbContext // from EF } private UserRepository UserRepository { get; set; } [Fact] public void DuplicateUserCannotBeCreated() { var testUser = new User // This test user already exists in database { Id = 0,AccountAlias = "domainfoo",DisplayName = "Foo",Email = "foo@bar.com",IsActive = true }; Assert.Throws<InvalidOperationException>(async () => await UserRepository.CreateAsync(testUser)); } public void Dispose() { if (UserRepository != null) { UserRepository.Dispose(); } } } 当我运行这个单元测试时,抛出Xunit.Sdk.ThrowsException(即没有抛出我的InvalidOperationException):
从调试器中,对GetDuplicateAsync()进行了评估,但是当执行LINQ查询时,结果从未返回,因此没有抛出异常.有人可以帮忙吗? 解决方法
xUnit的Assert.Throws(至少在版本1.9.2上)不是异步感知的.这已在版本2中修复,现在有一个
Assert.ThrowsAsync 方法.
因此,您可以升级到xUnit 2或创建自己的方法以使其正常工作: public async static Task<T> ThrowsAsync<T>(Func<Task> testCode) where T : Exception { try { await testCode(); Assert.Throws<T>(() => { }); // Use xUnit's default behavior. } catch (T exception) { return exception; } return null; } await ThrowsAsync<InvalidOperationException>(async () => await UserRepository.CreateAsync(testUser)); 从Haacked’s gist开始. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |