【发布时间】:2015-10-20 22:45:38
【问题描述】:
我的每个单元测试都需要一个登录用户,这迫使我在测试SetUp 中进行异步调用(登录)。
我找不到方法来完成这项工作,我要么得到空指针异常,要么设置无效签名。
public async void SetUp() {}
这使得我所有的测试都失败了,可能是因为我没有登录。
public async Task SetUp() {}
忽略我的所有测试,因为设置的签名无效。
而且我不想在每次测试中都复制我的 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);
}
【问题讨论】:
-
我已经阅读了很多关于在 SUT 中没有 async void 的博客文章,我没有,但是这些博客文章都没有谈论测试本身。我有设计问题吗?
-
你不能让你的测试方法异步而不是设置方法吗?或者您甚至可以使 SetUp 方法同步。不过建议使用前者。
-
只有断言的异步测试会显示警告。如果可能的话,我希望避免这种情况。
-
我不明白你的代码是如何工作的。它只是在Setup方法中使用
IUserService? -
我正在使用 UserService 登录(在测试的情况下使用硬编码数据),但这隐藏在这里。然后通过依赖注入创建我的视图模型,它需要登录到它的构造函数中。
标签: c# unit-testing asynchronous async-await nunit