gpt4 book ai didi

c# - 如何使用私有(private)实现对该代码进行单元测试?

转载 作者:行者123 更新时间:2023-11-30 20:53:05 25 4
gpt4 key购买 nike

我知道有一些问题与此类似,但似乎没有一个能满足解决以下有关单元测试的代码片段的正确方法

public class InMemoryQueue : ICloudQueue
{
private Queue<object> _inMemoryCollection = new Queue<object>();
private readonly ServiceBusQueueSettings _settings;

public InMemoryQueue(ServiceBusQueueSettings settings = null)
{
_settings = settings;

if (_settings == null) _settings = new ServiceBusQueueSettings();
}

public async Task<IEnumerable<T>> ReceieveAsync<T>(int batchCount)
{
List<T> result = new List<T>();
for (int i = 0; i < batchCount; i++)
{
_inMemoryCollection.Dequeue();
}
return result;
}

public async Task AddToAsync<T>(IEnumerable<T> items)
{
items.ToList().ForEach(x=>_inMemoryCollection.Enqueue(x));
}
}

好的,我想将 ICloudQueue 的这个实现单元化,以确保通过 AddToAsync 添加到的项目保存在内存中,并且从内存中提取对 RecieveAsync 的任何调用。

然而 - 复杂的是数据保存在 _inMemoryCollection 中,这是一个私有(private)变量。如果 _inMemoryCollection 队列是私有(private)的,其中一个测试可能如下所示:

    [Test]
public async Task Adding_To_Queue_Results_In_Message_Added_To_List()
{
//arrange
var listToAdd = new List<object>() { new object() };
var inMemoryQueue = new InMemoryQueue();

//act
await inMemoryQueue.AddToAsync(listToAdd);

//assert
Assert.IsTrue(inMemoryQueue._inMemoryCollection.Count == 1);
}

我想我可以将 _inMemoryCollection 更改为内部的,然后使用 [InternalsVisibleTo] 属性将其公开给单元测试。尽管我不太情愿,因为这意味着更改实现只是为了满足单元测试。

这是我唯一的选择吗?

最佳答案

我认为您可以通过接收返回的项目来检查您添加到队列中的项目是否已排队(实际上这是您队列的预期行为):

[Test]
public void Can_Receive_Added_Items()
{
//arrange
var listToAdd = new List<object> { new object() };
var inMemoryQueue = new InMemoryQueue();

//act
inMemoryQueue.AddToAsync(listToAdd).Wait();

//assert
var queuedItems = inMemoryQueue.ReceieveAsync(listToAdd.Count).Result;
CollectionAssert.AreEqual(listToAdd, queuedItems);
}

顺便说一句,目前您没有将项目添加到 result 列表中,因此您的测试将失败。

关于c# - 如何使用私有(private)实现对该代码进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20266014/

25 4 0
文章推荐: javascript - 如何使用 JavaScript 在可编辑的
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com