4

我是 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类的实现,据我了解,这不应该发生。使用该子句的目的是,我希望如果使用任何参数调用orgManagerStub'DataDataSet方法Int,只需返回我的xmlElement实例。我不希望我的代码运行OrgDataManager.

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

4

1 回答 1

13

根据文档

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

(我的重点)

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

于 2014-08-25T07:17:24.523 回答