【发布时间】:2017-03-12 14:09:40
【问题描述】:
我在测试单例时遇到了一些问题。当我运行此代码时,我在 TestGetLogicalDevices() 中遇到错误。 CallTo() 失败,因为服务不是假对象。当我尝试创建一个假对象(注释代码)时,它给出了一个错误,因为 RestService 是一个带有私有构造函数的单例。如何创建这个单例的假对象?
private RestService service;
[TestInitialize]
public void Init()
{
//service = A.Fake<RestService>();
service = RestService.Instance;
service.CreateClient("test", "test");
}
[TestMethod]
public async Task TestGetLogicalDevices()
{
var logicalDevices = (List<LogicalDevice>)A.CollectionOfFake<LogicalDevice>(10);
A.CallTo(() => service.GetLogicalDevices()).Returns(Task.FromResult(logicalDevices));
List<LogicalDevice> collectedData = await service.GetLogicalDevices();
Assert.AreEqual(2, collectedData.Count);
}
public async Task<List<LogicalDevice>> GetLogicalDevices()
{
var response = await client.GetAsync(apiBaseUrl + "/logical-devices");
if (response.IsSuccessStatusCode)
{
var json = await response.Content.ReadAsStringAsync();
var logicalDevices = JsonConvert.DeserializeObject<List<LogicalDevice>>(json);
var sortedList = logicalDevices.OrderBy(logicalDevice => logicalDevice.Name).ToList();
return sortedList;
}
else
{
return null;
}
}
更新 我添加了我想要测试的方法的代码。也许有人对更好的测试有建议?
【问题讨论】:
-
请发布 RestService 的代码,至少是相关位。
-
您不能使用模拟框架启动一个具体的类来表现您希望它的行为。这就是假货的用途。它们是依赖项的虚假版本,可用于测试依赖它们的类。目前尚不清楚您要通过此测试断言什么。
-
@tomredfern 我添加了我要测试的方法的代码。也许你有更好的解决方案来测试这个?
-
client.GetAsync(...)中客户端的类型是什么?
-
@tomredfern 这是一个带有身份验证的 HttpClient。这是代码:
byte[] authBytes = Encoding.UTF8.GetBytes(Username + ":" + Password); client = new HttpClient(); var authHeaderValue = Convert.ToBase64String(authBytes); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", authHeaderValue);
标签: c# unit-testing mocking singleton fakeiteasy