c# – Xunit Assert中的异步lambda表达式.Throws

c# – Xunit Assert中的异步lambda表达式.Throws,第1张

概述我有一些测试代码声明重复用户无法通过我的UserRepository创建. User.cs: public class User{ public int Id { get; set; } public string AccountAlias { get; set; } public string DisplayName { get; set; } publi 我有一些测试代码声明重复用户无法通过我的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 = "domain\foo",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):

Assert.Throws() Failure
Expected: system.invalIDOperationException
Actual: (No exception was thrown)

从调试器中,对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开始.

总结

以上是内存溢出为你收集整理的c# – Xunit Assert中的异步lambda表达式.Throws全部内容,希望文章能够帮你解决c# – Xunit Assert中的异步lambda表达式.Throws所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1239613.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存