Azure ICollector重载不是不同的实例

时间:2018-06-13 07:28:10

标签: c# azure interface overloading azure-functions

我为我的测试类重载了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);

运行功能将数据添加到收集器中。

当收集器被断言时,两个收集器中都包含两个添加的数据,而不是每个收集器都添加了一个数据。

2 个答案:

答案 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);
    }
}