从测试类中获取嵌套结构

本文关键字:嵌套 结构 获取 测试类 | 更新日期: 2023-09-27 18:03:54

我正在为以下类编写单元测试

Class myLegacyClassPresenter
{
  private MethodA(){}
  private propertyA {get; set;}
  private MethodB(YearValue value){}
 //some more properties & method goes here
 private struct YearValue
 {
    public static int One { get { return 365; } }
    public static int Two { get { return 730; } }
 } 
}

这是我的单元测试。

public void mytest()
{
 //some initializations
 var view = myLegacyView();
 var service = new Mock<ILegacyService>();
 var presenter = new myLegacyClassPresenter(view, service);
 var privateObject = new PrivateObject(presenter);
 //I can access all private methods and properties as follows
 privateObject.invoke("MethodA");
 privateObject.GetProperty("propertyA")
// But How can I get the the Struct Year value to pass to MethodB
privateObject.Invoke("MethodB", new object[]{YearValue.One}); //Compile Error for YearValue 
//I can't change in the class, One way is to define the same struct locally, Is there any other approach we can have to achieve the same result.
}

从测试类中获取嵌套结构

这是一个经典的例子,它展示了如果你不能对一个特定的组件进行单元测试,如何重构这个组件!

这就是任何mock框架强制你做的事情——编写解耦的代码。

两件事:

  1. 测试私有方法应该被认真地重新考虑。在测试私有方法和属性时,就会破坏封装。

  2. 在您的示例中,myLegacyClassPresenter类与YearValue结构体紧密耦合。你可以使用依赖注入来解耦它。

如果你想创建一个结构体的实例,你可以使用下面的代码

var theType = Type.GetType("MyNamespace.myLegacyClassPresenter+YearValue");
var parameter = Activator.CreateInstance(theType);
privateobject.Invoke("MethodB", new object[]{parameter});

如果需要传入YearValue。一个,然后可以使用type . getmember()来获取值