【问题标题】:How do I setup a private variable in a unit test如何在单元测试中设置私有变量
【发布时间】:2017-07-23 19:53:10
【问题描述】:

我很难对包含对象列表的类进行单元测试。

这就是我所拥有的

public class A 
{
    List<B> _list;

    public A() 
    {
        _list = new List<B>();
    }
    public void AddNewB(DateTime time)
    {
        _list.Add(new B(time));
    }
    public List<B> GetAllBs()
    {
        return _list;
    }
}

我想要一个测试来证明添加新的 B 不会清除我的列表。但是由于该列表是私有的,所以我无法设置一个现有的列表,而不会通过我想要测试的代码。由于类 A 负责创建所有新 B 并将它们添加到它的列表中,并且所有新 A 都应该有一个空的 B 列表,因此在构造函数中添加一个参数以进行测试感觉很奇怪。

编辑:我修复了 GetAllBs,因为它是 AddNewBs 的复制粘贴错误。

【问题讨论】:

  • 请记住,您要测试的单元是类,而不是方法。只要类的公共接口表现自己,你就不应该关心它在内部做什么。就您的测试而言,_list 甚至可能不存在。
  • 您可能想阅读此stackoverflow.com/a/1093481/2096538。你不应该关心类的内部实现,你应该检查外部可见的效果是否符合你的期望,否则你的测试会绑定到类的内部实现。
  • 调用我想测试的方法来设置我的测试我感觉很奇怪。

标签: c# unit-testing asp.net-core nunit


【解决方案1】:

首先,这个方法不会编译:

public void GetAllBs(DateTime time)
{
    return _list;
}

它的返回类型为void(不返回任何内容),但您返回List&lt;B&gt;。此外,您不需要参数来返回结果。将其更改为:

public List<B> GetAllBs()

关于测试:您可以轻松地测试您的列表。你的测试方法是这样的:

[TestMethod]
public void Test()
{
    A a = new A();
    a.AddNewB(DateTime.Now);    
    a.AddNewB(DateTime.Now); 

    Assert.AreEqual(2, a.GetAllBs().Count);
}

您应该创建A 类的对象并调用AddNewB() 来添加一些元素。为确保在添加新元素后不会清除列表,您应该再添加一个并检查列表中元素的Count。为此,您应该调用 GetAllBs() - 它会返回列表 - 并获取 Count。 Count 应该等于 2。

如果您想确保该方法经过测试,您可以使用一些显示代码覆盖率的工具(DotCover、OpenCover)。

【讨论】:

    【解决方案2】:

    您还可以使用允许您伪造私有字段的单元测试工具,例如我使用具有此功能的 Typemock。 因此您可以在测试中创建一个本地列表并将其注入私有字段以测试您的方法:

    [TestMethod]
    public void TestMethod1()
    {
        List<B> fakeList = new List<B> { new B(DateTime.Now), new B(new DateTime(1956, 01, 21)) };
        var classA = Isolate.Fake.Instance<A>(Members.CallOriginal,ConstructorWillBe.Ignored);
    
        var fakePrivate = Isolate.NonPublic.InstanceField(classA, "_list");
        fakePrivate.Value = fakeList;
    
        classA.AddNewB(DateTime.MaxValue);
    
        var res = classA.GetAllBs();
    
        Assert.AreEqual(3, res.Count);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      • 1970-01-01
      • 2019-09-27
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多