Я новичок в Unity и обнаружил, что с его асинхронным управлением немного сложно справиться, поэтому я использую IPromises
: https://github.com/Real-Serious-Games/C-Sharp-Promise, что позволяет мне использовать
MyAsyncFunction.Then(() =>
{
// What happened if everything went OK
}).Catch(error =>
{
// What happend if an exception was thrown
})
Я также использую Unity Rest Client , который использует IPromises
: https://github.com/proyecto26/RestClient
Я использую NUnit для тестирования, и кажется, что он должен вернуть задачу при тестировании asyn c кода.
В моем коде я использую Unity Rest Client и помещаю свой Assert
в части Then
. Проблема в том, что NUnit не ждет запроса и, следовательно, не выполняет утверждения.
Вот мой код:
[Test]
public async Task TestLogin()
{
_network.SendCode(_password)
.Then(authResp =>
{
Assert.True(authResp.IsSuccessful);
Assert.IsNotNull(authResp.Name);
Assert.IsNotNull(authResp.Surname);
Assert.IsNotNull(authResp.AccessToken);
Assert.AreEqual(authResp.AccessToken, _tokenStorage.RetrieveAccessToken());
});
}
И вот реализация SendCode
:
public IPromise<AuthenticationResponse> SendCode(string code)
{
var promise = new Promise<AuthenticationResponse>();
RestClient.Post("/api/login", new Credentials(code))
.Then(response =>
{
EditorUtility.DisplayDialog("JSON", JsonUtility.ToJson(response, true), "Ok");
promise.Resolve(new AuthenticationResponse("", "", true, "", "200"));
})
.Catch(error =>
{
EditorUtility.DisplayDialog("ERROR", JsonUtility.ToJson(error, true), "Ok");
promise.Reject(new Exception("Error when logging"));
});
return promise;
}
Я вижу 2 возможности:
- Преобразование
IPromise
в Task
в тесте - Изменение реализация
SendCode
, чтобы он возвращал Task
. И откажитесь от использования UnityRestClient : '(
Если кто-нибудь знает, как реализовать первый вариант или может дать мне небольшое руководство, чтобы выполнить второй, это было бы быть потрясающим.