Обновление: HttpTest
не является потокобезопасным, согласно ошибке GitHub< /а>. Пока проблема не будет решена, тесты с использованием HttpTest
нельзя запускать параллельно.
У меня есть действительно странная пара тестов с использованием Flurl и xUnit, которые при запуске всех в VS Test Explorer завершатся неудачей, но если они будут запущены по отдельности, они будут пройдены. Я не могу на всю жизнь увидеть, где эти 2 даже связаны друг с другом, но они есть.
Я извлек их из своего проекта в новый проект, и проблема не устранена. Я объединил их в 7z для всех, кто хочет загрузить его в VS, но полный код следует ниже.
Project.Commons
ПолучитьApi1:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Flurl;
using Flurl.Http;
namespace Project.Commons
{
public class GetApi1
{
public async Task<string> ExecuteAsync(string token)
{
string apikeyKeyname = "token";
dynamic response = await "http://www.api.com"
.SetQueryParams(new { token = token })
.GetJsonAsync();
string receivedApiKey = ((IDictionary<string, object>)response)[apikeyKeyname].ToString();
return receivedApiKey;
}
}
}
ПолучитьApi2:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Flurl;
using Flurl.Http;
namespace Project.Commons
{
public class GetApi2
{
public async Task<IList<string>> ExecuteAsync()
{
var responses = await "http://www.api.com"
.GetJsonAsync<List<string>>();
var result = new List<string>();
foreach (var response in responses)
{
result.Add("refined stuff");
}
return result;
}
}
}
Проект.Тесты
UnitTest1:
using Project.Commons;
namespace Project.Tests
{
public class UnitTest1
{
private ITestOutputHelper output;
public UnitTest1(ITestOutputHelper output)
{
this.output = output;
}
[Fact]
public async Task ShouldBeAbleToGetApiKeyFromToken()
{
// Arrange
using (var httpTest = new HttpTest())
{
var jsonResponse = new { token = "abcdef" };
string expectedApiKey = "abcdef";
httpTest.RespondWithJson(jsonResponse);
var api = new GetApi1();
// Act
var receivedApiKey = await api.ExecuteAsync("mockToken");
output.WriteLine("Received apikey = " + receivedApiKey);
// Assert
Assert.Equal(expectedApiKey, receivedApiKey);
}
}
}
}
UnitTest2
using Flurl.Http.Testing;
using Project.Commons;
using Xunit;
using Xunit.Abstractions;
namespace Project.Tests
{
public class UnitTest2
{
#region Mock API JSON Response
private IList<string> mockResponse = new List<string>()
{
"raw stuff", "raw stuff", "raw stuff"
};
#endregion
#region Expected Result
private IList<string> expectedResult = new List<string>()
{
"refined stuff", "refined stuff", "refined stuff"
};
#endregion
[Fact]
public async Task CanGetProjectsByWeek()
{
// Arrange
using (var httpTest = new HttpTest())
{
httpTest.RespondWithJson(mockResponse);
// Act
var api = new GetApi2();
var actualResult = await api.ExecuteAsync();
// Assert
Assert.Equal(expectedResult,actualResult);
}
}
}
}
HttpTest
, это не совсем похоже на то, что он хорошо работает с несколькими потоками. - person Damien_The_Unbeliever   schedule 30.06.2016async
из тестов и вместоawait api.ExecuteAsync()
попробовалExecuteAsync().Result
. Тесты из одного и того же класса тестов будут пройдены, но тесты из других классов не пройдены. Похоже, что классы по-прежнему выполняются асинхронно. - person batrand   schedule 30.06.2016async
. - person Damien_The_Unbeliever   schedule 30.06.2016HttpTest
работает, переписывая эту конфигурацию. А затем сбросить все обратно к значениям по умолчанию, когда оно будет удалено, что не сработает, если их несколько. - person Damien_The_Unbeliever   schedule 30.06.2016