如何测试方法包括Unity中的异步方法

How to test method include async method in Unity

我想使用异步方法测试方法。 但是,当我 运行 测试时,UnityEditor 正在阻塞。

我想,这个问题是因为异步方法。 我不知道如何解决这个问题。

Unity 版本:Unity 2020.3.33f1

public async static Task<string> GetAsync() {

    // Do something
    HttpResponseMessage response = await request.GetAsync(..);
    string responseData = await response.Content.ReadAsStringAsync();


    return response Data
}

...


public string GetData() {
    Task<string> res = GetAsync();
    return res.Result;
}


////////////////// Test Code //////////////

[Test]
public void Test_GetData() {
   ...
   string res = GetData()
   ...
}


未经测试,您需要在所有地方使用async/await。

当使用async/await时,因为你已经完成了返回字符串类型的Task,但是对于void方法,你只需要使用Task。

假设

public static async Task<string> GetAsync()
{
    return await Task.FromResult("test");
}

你的测试应该是这样的:

[Test]
public async Task Test_GetAsync()
{
    var result = await GetAsync();
    Assert.AreEqual("test", result);
}

如果我们接受你的代码

public async static Task<string> GetAsync() {
    // what ever
    .....
    return responseData
}

测试将是:

[Test]
public async Task Test_GetData() {
   ...
   string res = await GetData()
   ...
}

如果您的测试项目是较旧的 .net 框架,您可以将其升级到较新的版本,如 answer suggests. Otherwise, if you are locked and not able to upgrade, you can do something which I am not suggesting as this answer 所述。

[Test]
public void Test_GetData()
{
    var result = GetAsync().GetAwaiter();
    Assert.AreEqual("test", result.GetResult());
}