.net 正确的使用方法是什么?ExceptionAsync?

pgpifvop  于 2023-05-01  发布在  .NET
关注(0)|答案(1)|浏览(92)

如何正确使用Record.ExceptionAsync
await Record.ExceptionAsync(async () => await x.GetAsync())

await Record.ExceptionAsync(() => x.GetAsync())
示例:

[Fact]
public async Task ShouldValidateDuplicateEmailOnSave()
{
    var user = new User();
    var predicate = () => It.IsAny<Expression<Func<User, bool>>>();
    var sut = _autoMock.Create<IUserService>();
    var validator = _autoMock.Mock<IUniquenessValidator<User>>();
    validator
        .Setup(m => m.Validate<EmailUniquenessError>(predicate.Invoke()))
        .Throws(new EmailUniquenessError());

    var actual = await Record.ExceptionAsync(() => sut.Save(user)); // I don't use postfix "Async"

    Assert.NotNull(actual);
    Assert.IsType<EmailUniquenessError>(actual);
    validator.Verify(v => v.Validate<EmailUniquenessError>(predicate.Invoke()), Times.Once);
}

我不明白有什么区别,我在测试中看不到。

rjee0c15

rjee0c151#

真的没有太大的区别。async/await只是引入了一个状态机来解包Task<>中的值。
所以,加倍努力:

await Record.ExceptionAsync(async () => await x.GetAsync())

从单元测试的Angular 来看,这相当于:

await Record.ExceptionAsync(() => x.GetAsync())

这里的一个区别是,当你在async/await上加倍时,代码必须更加努力地在lambda中打开Task。只要你在lambda之外等待,单元测试应该没问题。

相关问题