C# 异步测试初始化保证测试失败
在TestInitialize中进行异步调用是不正确的,因为TestInitialize必须在任何TestMethod之前进行,并且具有固定的签名 这是否也是异步测试初始化的正确方法C# 异步测试初始化保证测试失败,c#,.net,unit-testing,asynchronous,tdd,C#,.net,Unit Testing,Asynchronous,Tdd,在TestInitialize中进行异步调用是不正确的,因为TestInitialize必须在任何TestMethod之前进行,并且具有固定的签名 这是否也是异步测试初始化的正确方法 private int val = 0; [TestInitialize] public async Task TestMehod1() { var result = await LongRunningMethod(); val = 10;
private int val = 0;
[TestInitialize]
public async Task TestMehod1()
{
var result = await LongRunningMethod();
val = 10;
}
[TestMethod]
public void TestMehod2()
{
Assert.AreEqual(10, val);
}
有什么想法吗?您想做的是使用
.Result
或.Wait()
同步阻止测试初始化方法。您可以执行以下操作:
private int val = 0;
[TestInitialize]
public void TestMehod1()
{
Task<object> result = await LongRunningMethod();
result.Wait();
val = 10;
}
[TestMethod]
public void TestMehod2()
{
Assert.AreEqual(10, val);
}
private int val=0;
[测试初始化]
公共无效测试方法1()
{
任务结果=等待LongRunningMethod();
result.Wait();
val=10;
}
[测试方法]
公共无效测试方法2()
{
断言.AreEqual(10,val);
}
最干净的方法可能是让测试初始化
启动异步操作,如下所示:
[TestClass]
public class UnitTestAsync
{
private Task<int> val = null;
[TestInitialize]
public void TestInitializeMethod()
{
val = TestInitializeMethodAsync();
}
private async Task<int> TestInitializeMethodAsync()
{
return await LongRunningMethod();
}
private async Task<int> LongRunningMethod()
{
await Task.Delay(20);
return 10;
}
[TestMethod]
public async Task TestMehod2()
{
Assert.AreEqual(10, await val);
}
}
[TestClass]
公共类UnitTestAsync
{
私有任务val=null;
[测试初始化]
public void TestInitializeMethod()
{
val=TestInitializeMethodAsync();
}
专用异步任务TestInitializeMethodAsync()
{
return wait LongRunningMethod();
}
专用异步任务LongRunningMethod()
{
等待任务。延迟(20);
返回10;
}
[测试方法]
公共异步任务TestMehod2()
{
Assert.AreEqual(10,等待值);
}
}
只需为各种初始化调用(每个返回任务)创建一个任务数组,然后使用task.WaitAll()
[ClassInitialize()]
公共静态void初始化(TestContext上下文)
{
列表任务=新列表();
tasks.Add(InitializeMethod1());
tasks.Add(InitializeMethod2());
Task.WaitAll(tasks.ToArray());
}
公共静态异步任务InitializeMethod1()
{
}
公共静态异步任务InitializeMethod2()
{
}
您的代码是正确的强>
澄清这个问题的答案是5年后,2个月后的最初问题。当时使用async[TestInitialize]
可能是一个编译错误,但现在不是了
可以使用async[TestInitialize]
、async[ClassInitialize]
和async[TestMethod]
只需使用Wait即可
正确使用async和Wait可能是最干净的方法。我的代码中有如下内容,我需要获得我们的类别结构,以便能够测试my类是否与我们现有的类别结构配合良好
private Category rootCategory;
[TestInitialize]
public async Task TestInitialize()
{
var loader = new CategoryLoader();
rootCategory = await loader.GetAllCategoriesAsync();
}
[TestInitialize]
在每次[TestMethod]
之前运行,因此根据我在这里尝试测试的内容,最好只加载一次,然后进行所有断言,而不必多次支付加载时间。但是你需要小心,这样测试就不会相互影响,从而得到一致和正确的结果
请注意,这不再是单元测试,因为我正在测试与外部服务的集成。您不觉得这有点冒险吗?如果依赖于初始化完成,则每次测试都应等待初始化完成。忘记一个,它可能会很好;最终,首先运行并等待初始化的测试被删除,而不相关的测试被中断。看起来异步同步调用是其中一种危害较小的情况。@romkyns:如果你愿意,你可以这样做。任何一种方法都同样有风险——你有一个任务
,如果不等待或阻止它,你就无法到达t
。当然,您可以忘记等待(假设您不需要t
),就像您可以忘记阻止一样。就我个人而言,我从来没有在任何单元测试中使用过初始化方法。如果我需要共享初始化代码,我会在我的测试项目中引入一个实际的类型,必要时由我的各个测试使用。这不会编译。不能在未使用async
修饰符声明的方法中使用wait
关键字。第六行应该是:Task result=LongRunningMethod()代码>MSTest V1:没有编译器错误,但存在运行时错误:方法的签名错误。该方法必须是非静态的、公共的、不返回值且不应采用任何参数。
。MSTest V2:这不正确:“…签名错误。该方法必须是非静态的、公共的、不返回值且不应接受任何参数。”这不正确:“…签名错误。该方法必须是非静态的、公共的、不返回值且不应接受任何参数。”
private Category rootCategory;
[TestInitialize]
public async Task TestInitialize()
{
var loader = new CategoryLoader();
rootCategory = await loader.GetAllCategoriesAsync();
}