我为我的测试类重载了Azure ICollector接口。
但是,当创建收集器并添加数据时,初始化的两个收集器将被视为单个收集器。
以下是我的collcetor类代码。
using System.Collections.Generic;
using Microsoft.Azure.WebJobs;
namespace ChangeFeedPublisherTests
{
class TestCollector<T> : ICollector<T>
{
public static List<T> Collector = new List<T>();
public void Add(T item)
{
Collector.Add(item);
}
public List<T> GetCollector()
{
return Collector;
}
}
}
两个收集器初始化如下,包括我的测试代码
var actualCollector = new TestCollector<String>();
var documents = new List<Document>();
Document document = CreateDocument();
var changedSubdocuments = new List<String>();
changedSubdocuments.Add("AlternateId");
document.SetPropertyValue(ChangedSubdocumentsPropertyName, changedSubdocuments);
documents.Add(document);
MessageHandler.Run(documents, actualCollector, logger);
var expectedCollector = new TestCollector<String>();
var changeFeedMessage = DocumentToChangeFeedMessage(document);
var cloudEvent = CreateCloudEvents(JObject.FromObject(changeFeedMessage));
expectedCollector.Add(JsonConvert.SerializeObject(cloudEvent));
var expectedCollection = expectedCollector.GetCollector();
var actualCollection = actualCollector.GetCollector();
Assert.AreEqual(expectedCollection, actualCollection);
Assert.AreEqual(expectedCollection.Count, 1);
运行功能将数据添加到收集器中。
当收集器被断言时,两个收集器中都包含两个添加的数据,而不是每个收集器都添加了一个数据。
答案 0 :(得分:2)
那是因为你有
public static List<T> Collector = new List<T>();
它是静态的,因此它在所有实例之间共享。
只需删除static
关键字。
P.S。 &#34;重载&#34;这里不是正确的词:你&#34;实施&#34;界面,或者&#34;嘲笑&#34; /&#34;伪造&#34;它
P.P.S。最简单的实现如下所示:
class TestCollector<T> : ICollector<T>
{
public List<T> Collector => new List<T>();
public void Add(T item)
{
Collector.Add(item);
}
}
Collector
是只读的,您不需要冗余的GetCollector
方法。
答案 1 :(得分:0)
如果要在此TestCollector中声明消息,则获取Collector属性始终会返回一个新列表。
我建议这样修改它:
internal class TestCollector<T> : ICollector<T>
{
public List<T> Collector { get; }
internal TestCollector()
{
this.Collector = new List<T>();
}
public void Add(T item)
{
Collector.Add(item);
}
}