繁体   English   中英

我怎样才能测试这个

[英]How can I test this

假设我有以下代码,我想测试Data class 在调用Dowork()时是否正确调用了两个项目类的Update()方法。

`

    public class Item1
    {
        public string Name { get; private set; }

        public void Update(string value) { Name = ...; }
    }

    public class Item2
    {
        public string Name { get; private set; }

        public void Update(string value) { Name = ...; }
    }


    public class Data
    {
        public Item1 Item1 { get; set; }
        public Item2 Item2 { get; set; }

        public void Dowork()
        {
            Item1.Update("Q");
            Item2.Update("W");
        }

    }

`

如果我不能修改 Item1 和 Item2 类(外部代码)来添加可以模拟的接口,我该如何实现呢?

一种选择是在测试中调用Dowork()之前和之后检查Item.NameItem2.Name ,但是我不是在测试 Item1 和 Item2 的实现吗? 即,如果 Item1 或 Item2 发生变化,那么即使我没有测试它们的行为,我的测试也会中断。

我真正关心的是 Data 在调用 DoWork 时调用 Update 方法,而不是此时 Item 类碰巧做了什么。

我想向您推荐NSubstitute nuget package,您可以将其用于 mocking 并轻松检查方法调用。

[Fact]
public void Check_Method_Call()
{
  var item1= Substitute.For<Item1>();
  var item2= Substitute.For<Item2>();
  var data= new Data()
           {
             Item1=item1,
             Item2=item2
           };

  //call update methods
  data.Dowork();

  //check method calls
  item1.Received(1).Update("Q");//or you can use Arg.Any<string>()
  item2.Received(1).Update(Arg.Any<string>());

}

暂无
暂无

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

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