如何解决覆盖多个子类中的处理方法
我目前正在使用 Xunit 在我的 .NET Core 项目中编写一些集成测试。作为其中的一部分,我在自定义类中运行测试之前设置数据和其他信息。
using Microsoft.AspNetCore.TestHost;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Xunit;
namespace XUnitTestProject1
{
public class BaseClassFixture<TStartup> : IAsyncLifetime where TStartup : class
{
private readonly TestServer _server;
public HttpClient Client { get; }
public BaseClassFixture()
{
Client = new HttpClient();
Client.BaseAddress = new Uri("https://apple.com");
Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
}
protected virtual void dispose(bool disposing)
{
if (disposing)
{
_server?.dispose();
this.Client?.dispose();
}
}
public Task disposeAsync()
{
return Task.CompletedTask;
}
public Task InitializeAsync()
{
throw new NotImplementedException();
}
}
}
我的第一个儿童班:
using Microsoft.AspNetCore.TestHost;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Xunit;
namespace XUnitTestProject1
{
public class GoogleTestClassFixture<TStartUp> : BaseClassFixture<TStartUp>,IAsyncLifetime where TStartUp : class
{
private readonly TestServer _server;
public HttpClient GoogleClient { get; }
public GoogleTestClassFixture()
{
GoogleClient = new HttpClient();
GoogleClient.BaseAddress = new Uri("https://google.com");
GoogleClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
}
public void dispose()
{
_server?.dispose();
GoogleClient?.dispose();
base.dispose(true);
}
public Task disposeAsync()
{
throw new NotImplementedException();
}
public Task InitializeAsync()
{
throw new NotImplementedException();
}
}
}
我的第二个孩子班:
using Microsoft.AspNetCore.TestHost;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Xunit;
namespace XUnitTestProject1
{
public class FaceBookTestClassFixture<TStartUp> : BaseClassFixture<TStartUp>,IAsyncLifetime where TStartUp : class
{
private readonly TestServer _server;
public HttpClient FaceBookClient { get; }
public FaceBookTestClassFixture()
{
FaceBookClient = new HttpClient();
FaceBookClient.BaseAddress = new Uri("https://facebook.com");
FaceBookClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
}
public void dispose()
{
_server?.dispose();
FaceBookClient?.dispose();
base.dispose(true);
}
public Task disposeAsync()
{
throw new NotImplementedException();
}
public Task InitializeAsync()
{
throw new NotImplementedException();
}
}
}
当我一次在测试资源管理器中运行所有测试时,有时我会收到错误“无法访问处置对象”。我假设,发生这种情况是因为有时与一个测试夹具相关的测试正在运行并且对象已被释放,而另一个测试夹具无法从基类夹具访问已被释放的项目。
我的第一个测试看起来像这样:
public class GoogleTests
{
private readonly HttpClient _googleClient;
private readonly HttpClient _baseClient;
public GoogleTests(GoogleTestClassFixture<StartUp> fixture)
{
_googleClient = fixture.GoogleClient;
_baseClient = fixture.Client;
}
[Fact]
public async Task ValidateFirstClient()
{
var getDetails = await _googleClient.GetAsync("//someRoute");
var uri = new Uri("https://someRandom.com");
var postDetails = await _baseClient.PutAsync(uri,getDetails.Content);
var response = await postDetails.Content.ReadAsstringAsync();
dynamic dynamicResponse = JObject.Parse(response);
((int)dynamicResponse.myProperty).Should().Be(0);
}
}
我的第二堂测试课:
using FluentAssertions;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Xunit;
namespace XUnitTestProject1
{
public class FaceBookTests
{
private readonly HttpClient _fbClient;
private readonly HttpClient _baseClient;
public FaceBookTests(FaceBookTestClassFixture<StartUp> fixture)
{
_fbClient = fixture.FaceBookClient;
_baseClient = fixture.Client;
}
[Fact]
public async Task ValidateFirstClient()
{
var getDetails = await _fbClient.GetAsync("//someRoute");
var uri = new Uri("https://someRandom.com");
var postDetails = await _baseClient.PutAsync(uri,getDetails.Content);
var response = await postDetails.Content.ReadAsstringAsync();
dynamic dynamicResponse = JObject.Parse(response);
((int)dynamicResponse.myProperty).Should().Be(0);
}
}
}
enter code here
我该如何解决这个问题,并确保在完成所有测试之前不会释放对象? 注意:我创建了一个简单的 web 应用程序项目只是为了在我的测试项目中获取 startup.cs 类作为参考
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。