Почему моя переменная меняется автоматически после того, как я вызвал ее в тесте Xunit? - PullRequest
0 голосов
/ 04 июля 2019

Я новичок в использовании теста Xunit и тестирую метод добавления элемента в список <>.Моя проблема в том, что сначала я назначаю свой пустой список переменной с именем check1, затем я добавляю 2 элемента в свой список, а затем я назначаю свой список с 2 элементами переменной, называемой check2.Ничего сумасшедшего, я бы сказал, но когда я использовал режим отладки, я понял, что моя переменная check1 увеличивается, когда я добавляю элементы в свой список.

Я действительно не знаю, что делать.Я предполагаю, что способ запуска модульных тестов Xunits особый, и он может запускать несколько тестов одновременно, поэтому он изменяет check1, но я не уверен, потому что я не понимаю, как (или в каком порядке) запускается Xunitметоды тестирования.

Вот мой метод тестирования

[Fact]
public void addAnalysisDataTest()
        {
            List<AnalysisData> check1 = AnalysisDataManager.getInstance().getAnalysisData();
            AnalysisDataManager.getInstance().AddAnalysisData("Name3", true, new List<AnalysisElementData> { new AnalysisElementData(0, "Grid", "", ""), new AnalysisElementData(1, "PivotGrid", "", "") });
            AnalysisDataManager.getInstance().AddAnalysisData("Name4", true, new List<AnalysisElementData> { new AnalysisElementData(0, "Grid", "", ""), new AnalysisElementData(1, "PivotGrid", "", "") });
            List<AnalysisData> check2 = AnalysisDataManager.getInstance().getAnalysisData();
            Assert.True(Equals(check2.Count, check1.Count +2));
        }

Вот мой метод класса AnalysisDataManager:

private static AnalysisDataManager instance = null;
private List<AnalysisData> analysis = new List<AnalysisData> { };
private List<int> listIdUsed = new List<int> { }; //Used to automatically create new unique ID

public static AnalysisDataManager getInstance(){...} //Getting the instance of the class

private AnalysisDataManager(){}

public List<AnalysisData> getAnalysisData(){return analysis;} //Returning my List<>

public void AddAnalysisData(string analysisName, bool modificationAllowed, List<AnalysisElementData> elements)
        {
            int idAnalysis = 0;
            if (listIdUsed.Count != 0)
            {
                idAnalysis = listIdUsed.Max() + 1;
            }
            listIdUsed.Add(idAnalysis);
            analysis.Add(new AnalysisData(idAnalysis, analysisName, modificationAllowed, elements));
        }

Если вы хотите узнать, какие другие мои методы тестированияпросто спросите меня, и я буду обновлять этот пост.

Ответы [ 2 ]

1 голос
/ 04 июля 2019

Это не имеет ничего общего с XUnit. Вы всегда возвращаете один и тот же список, а не его копию, поэтому список, на который ссылается check1, равен точно и совпадает с тем, на который ссылается check2, и оба они точно такой же, как личный analysis список внутри вашего AnalysisDataManager экземпляра. Таким образом, у вас есть три ссылки на один и тот же список, поэтому, когда вы вставляете элемент в список, все ссылки «видят» этот элемент.

Если вы хотите вернуть копию списка (и вам, вероятно, следует сохранить инкапсуляцию), тогда ваш getAnalysisData должен вернуть analysis.ToList().

0 голосов
/ 04 июля 2019

Мне кажется, что ваш AnalysisDataManager является синглтоном, поэтому всякий раз, когда вы вызываете getInstance, вы получаете тот же статический экземпляр класса. Если вы получите тот же экземпляр класса, то при вызове getAnalysisData() вы получите тот же список в качестве ответа.

В этом случае ваш тест верен, поскольку check1 и check2 являются ссылками на один и тот же список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...