在c#中设置异步UnitTests

Gil*_*and 5 c# nunit unit-testing asynchronous async-await

我需要为每个单元测试都有一个登录用户,这迫使我在测试中进行异步调用(登录)SetUp.

我无法找到使这项工作的方法,我要么得到空指针异常,要么设置无效签名.

public async void SetUp() {}
Run Code Online (Sandbox Code Playgroud)

这使我的所有测试都失败了我的对象可能是因为我没有登录.

public async Task SetUp() {}
Run Code Online (Sandbox Code Playgroud)

使我的所有测试都被忽略,因为安装程序的签名无效.

而且我不想在每次测试中复制我的X行设置,因为它们都完全相同,而且......这就是设置的目的.

我错过了什么?这似乎是一个微不足道的问题.

这是我现在所拥有的,为了展示一些东西

CreateTicketViewModel _viewModel;

        [SetUp()]
        public async void SetUp()    //I have tried using Task instead of void
        {

            IUserService userService = Dependency.Instance.Resolve<IUserService>();
            await userService.LoginAsync(this.UserName, this.Password);

            _viewModel = Dependency.Instance.Resolve<CreateTicketViewModel>();
        }

        [TearDown()]
        public void TearDown()
        {
            _viewModel = null;  // I have tried removing this
        }

        [Test()]
        public void Initialization()
        {
            // If I put what's in SetUp here and add "async" before void,
            // it works just fine

            Assert.IsNotNull(_viewModel);
            Assert.IsNotNull(_viewModel.Ticket);
        }
Run Code Online (Sandbox Code Playgroud)

Dan*_*inu 5

根据您使用的单元测试框架async,该框架可能无法正确处理设置。

在 NUnits 的情况下,我认为它不支持异步设置方法。

所以你应该在你的设置中做的是同步等待登录完成:

userService.LoginAsync(this.UserName, this.Password).Wait();

编辑:看起来这是一个悬而未决的问题https://github.com/nunit/nunit/issues/60

MSTests 也是如此。