【问题标题】:How to fake an object in NSubstitute and ignore its method's internal implementation?如何在 NSubstitute 中伪造一个对象并忽略其方法的内部实现?
【发布时间】:2014-08-25 07:07:07
【问题描述】:

我是 NSubstitute 的新手,并试图伪造一个名为 OrgDataWS 的现有类。这个类有一个名为GetDataSet的方法:

 public XmlElement GetDataSet(int token)
 {
        string perfLogMessage = string.Format("Org.GetDataSet: {0}", Guid.NewGuid().ToString());
        MultiMessagePerformanceCounter performanceCounter = MultiMessagePerformanceCounter.StartNew(perfLogMessage);
        XmlElement result = orgDataManager.GetDataSet(token);
        performanceCounter.Stop();

        return result;
 }

以下是我的测试方法:

 [TestMethod]
 public void GetDataSetTest()
 {
      var dataWSStub = Substitute.For<OrgDataWS>();

      var orgManagerStub = Substitute.For<OrgDataManager>();

      var document = new XmlDocument();
      var xmlElement = document.CreateElement("a");
      orgManagerStub.GetDataSet(Arg.Any<int>()).Returns<XmlElement>(xmlElement);


      dataWSStub.OrgDataManager = orgManagerStub;


      var result = dataWSStub.GetDataSet(99);
 }

但是,当我运行我的测试方法时,这一行

orgManagerStub.GetDataSet(Arg.Any<int>()).Returns<XmlElement>(xmlElement);

抛出异常。这个异常来自OrgDataManager 类的实现,据我了解,这不应该发生。使用该子句的目的是我希望如果使用任何Int 参数调用orgManagerStubDataDataSet 方法,只需返回我的xmlElement 实例。我不希望我的代码运行OrgDataManager 的详细实现。

我的测试代码有什么问题?如何解决?

【问题讨论】:

  • 我不认为你可以替代具体的类型,至少方法需要是虚拟的。

标签: c# unit-testing nsubstitute


【解决方案1】:

根据the documentation

警告:替换类可能会产生一些令人讨厌的副作用。 对于初学者来说,NSubstitute 只能与类的虚拟成员一起使用,因此类中的任何非虚拟代码都会实际执行!如果您尝试在构造函数或非虚拟属性设置器中替换格式化硬盘驱动器的类,那么您就是在自找麻烦。如果可能,坚持替换接口。

(我的重点)

您显示的声明不是虚拟的,因此解决方案是为它创建一个接口并替换它,或者至少使该方法成为虚拟的(可能还有其他方法)。

【讨论】:

  • 我明白你的意思。实际上我确实有一个类的接口。但是,从我的角度来看,我正在尝试测试实现,或者我想确保调用了“orgDataManager”的 DataDataSet 方法。但是,我无法在接口中定义属性,这意味着当调用“orgDataManager”对象的 GetDataSet 方法时,我无法告诉从接口模拟的对象返回我预定义的 XmlElement 实例。
  • 好吧,我知道如何测试了。我需要测试经理,而不是 OrgDataWS。
  • 这里重要的部分是substitute,除非你给NSubstitute一个方法来做替换,否则它不能完成它的工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-14
  • 2016-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多