微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我有一些测试代码声明重复用户无法通过我的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开始.

原文地址:https://www.jb51.cc/csharp/97709.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐