Azure ICollector Перегружены не отдельные экземпляры - PullRequest
0 голосов
/ 13 июня 2018

У меня перегружен интерфейс Azure ICollector для моих тестовых классов.

Однако при создании сборщика и добавлении данных два инициализированных сборщика обрабатываются как один сборщик.

Нижемой код для класса коллекторов.

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);

Функция запуска добавляет данные в коллектор.

Когда сборщики утверждены, оба добавленных данных включаются в оба сборщика, вместо каждого из которых добавляются по одному.

1 Ответ

0 голосов
/ 13 июня 2018

Это потому, что у вас есть

public static List<T> Collector = new List<T>();

Это статично, поэтому оно используется всеми экземплярами.

Просто удалите ключевое слово static.

PS «Перегрузка» здесь не то слово: вы «реализовали» интерфейс или «притворялись» / «подделали» его.

PPS Самая простая реализация выглядела бы так:

class TestCollector<T> : ICollector<T>
{
    public List<T> Collector => new List<T>();

    public void Add(T item)
    {
        Collector.Add(item);
    }
}

Collector только для чтения, и вам не нужен избыточный GetCollector метод.

...