Async TestInitialize 保证测试失败

问题描述 投票:0回答:5
在 TestInitialize 中进行异步调用是“不正确的”,因为 TestInitialize 必须在任何 TestMethod 之前发生并且具有固定签名。

这是否也是异步 TestInitialize 的正确方法?

private int val = 0; [TestInitialize] public async Task TestMehod1() { var result = await LongRunningMethod(); val = 10; } [TestMethod] public void TestMehod2() { Assert.AreEqual(10, val); }

有什么想法吗?
    

c# .net unit-testing asynchronous tdd
5个回答
17
投票

澄清这个答案是在最初问题提出后 5 年零 2 个月。那时,异步 [TestInitialize]

可能是一个编译错误,但现在不是了。

可以使用 async 
[TestInitialize]

、async

[ClassInitialize]

 和 async 
[TestMethod]
,只需使用 wait 即可。
正确使用 async 和 wait 可能是最简洁的方法。我的代码中有类似以下内容的内容,我需要获取类别结构,以便能够测试我的类是否与我们拥有的类别结构配合良好。

private Category rootCategory; [TestInitialize] public async Task TestInitialize() { var loader = new CategoryLoader(); rootCategory = await loader.GetAllCategoriesAsync(); }

[TestInitialize]
在每个

[TestMethod]

 之前运行,因此根据我在这里尝试测试的内容,最好只加载一次然后进行所有断言,而不是多次加载加载时间。但您需要小心,以便测试不会相互影响,以获得一致且正确的结果。
请注意,这不再是单元测试,因为我正在测试与外部服务的集成。

可能最简洁的方法是使用

16
投票

start

 异步操作,如下所示:
[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); } }

你想要做的是使用 

10
投票

.Wait()

 来同步阻塞 
TestInitialize
 装饰方法。您可以执行以下操作:
private int val = 0;

[TestInitialize]
public void TestMehod1()
{
    Task<object> result = LongRunningMethod();
    result.Wait();

    val = 10;
}

[TestMethod]
public void  TestMehod2()
{
    Assert.AreEqual(10, val);
}

只需为各种初始化调用(每个返回任务)创建一个任务数组,然后使用 Task.WaitAll()

7
投票
[ClassInitialize()] public static void Initialize(TestContext context) { List<Task> tasks = new List<Task>(); tasks.Add(InitializeMethod1()); tasks.Add(InitializeMethod2()); Task.WaitAll(tasks.ToArray()); } public static async Task InitializeMethod1() { } public static async Task InitializeMethod2() { }

确保您使用正确的签名,例如 

0
投票
,而不是对

public async void SetupTest()

 方法说 
[TestInitialize]

© www.soinside.com 2019 - 2024. All rights reserved.