从测试类中获取嵌套结构
本文关键字:嵌套 结构 获取 测试类 | 更新日期: 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框架强制你做的事情——编写解耦的代码。
两件事:
-
测试私有方法应该被认真地重新考虑。在测试私有方法和属性时,就会破坏封装。
-
在您的示例中,
myLegacyClassPresenter
类与YearValue
结构体紧密耦合。你可以使用依赖注入来解耦它。
如果你想创建一个结构体的实例,你可以使用下面的代码
var theType = Type.GetType("MyNamespace.myLegacyClassPresenter+YearValue");
var parameter = Activator.CreateInstance(theType);
privateobject.Invoke("MethodB", new object[]{parameter});
如果需要传入YearValue。一个,然后可以使用type . getmember()来获取值