繁体   English   中英

在Xunit测试中调用变量后,为什么变量会自动更改?

[英]Why does my variable change automatically when after I called it in Xunit test?

我是使用Xunit测试的新手,正在测试一种将元素添加到List <>的方法。 我的问题是,首先将空列表分配给名为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));
        }

如果您想知道我的其他测试方法是什么,请问我,我将更新此帖子。

它与XUnit无关。 你总是返回相同的列表,而不是它的拷贝,因此通过引用的名单check1完全一样的一个由引用check2 ,他们都完全一样,私人analysis您的内部列表AnalysisDataManager实例。 因此,您基本上具有对同一列表的三个引用,因此,当您将元素插入列表时,所有引用都会“看到”该元素。

如果要返回列表的副本(并且可能应该保留封装),则getAnalysisData应该返回analysis.ToList()

在我看来,您的AnalysisDataManager是一个Singleton,因此,每当调用getInstance您都将获得该类的相同静态实例。 如果获得该类的相同实例,则在调用getAnalysisData()您将收到相同的列表作为响应。

在这种情况下,您的测试是正确的,因为check1check2都是对同一列表的引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM