单元测试提供MissingMethodException的私有方法

时间:2019-05-21 13:52:39

标签: c# unit-testing

在单元测试中,我需要使用private调用PrivateObject方法。

private void UrgentBackupButton_Click(object parameter)
{
    // Do Something...
}

这是我的单元测试:

[TestMethod]
public void TestMethod1()
{
    //MainWindowViewModel main = new MainWindowViewModel();

    PrivateObject privateObj = new
    PrivateObject(typeof(MainWindowViewModel));

    privateObj.Invoke("UrgentBackupButton_Click",null);
}

它给我privateObj.Invoke("UrgentBackupButton_Click",null)的例外情况:

  

mscorlib.dll中发生了'System.MissingMethodException'类型的异常,但未在用户代码中处理

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

单元测试应该用来测试C#类的公共接口。私有方法不能被其他类访问,因此对于测试类也没有访问权限是很有意义的。

UrgentBackupButton_Click似乎是一个事件处理程序,因此,如果要测试它,就必须找到一种方法来手动触发该事件而不是调用该事件,但这取决于您正在使用的平台(WPF, UWP,Xamarin等)

答案 1 :(得分:1)

如果您发现需要对私有方法进行单元测试,则一种解决方案是将该方法分为自己的类,或者,如果它是纯方法,则可能是可以单独测试的静态方法。

在处理从UI调用的方法时,这也很有帮助。为了通过UI测试方法,您需要某种自动集成测试。但是,如果将相同的代码放在单独的类中,则现在可以在没有UI的情况下对其进行测试。现在是单元测试。

这是为什么从我们的UI中分离出尽可能多的应用程序逻辑有益的原因之一。编写调用方法的单元测试很容易。编写集成测试以加载表单并按一个按钮以调用完全相同的代码是不太容易的。

我并不是建议我们应该对每个类中的每个私有方法执行此操作。如果我们的类足够小,那么我们可以通过公共接口测试所有内容。但是从本质上讲,一种形式将要调用各种代码,并且将大量的形式包含在一个表单类中的私有方法中是没有意义的。

我们可以使用依赖注入将代码移出表单,但是我们也可以使用以下简单的方法做到这一点:

private void UrgentBackupButton_Click(object parameter)
{
    var doesSomething = new ClassThatDoesSomething();
    doesSomething.DoSomething();
}

如果方法中的代码取决于它从表单或事件参数中获取的值,则可以将这些值传递给类(在其构造函数中或作为方法参数)。尽可能传递非UI类型。例如,如果该方法需要文本框的值,则传递该值,而不是文本框本身。

所有这些操作完成之后,测试事件处理程序将不再那么重要,因为它实际上除了调用另一个类中的另一个方法外不会做任何事情,而且该方法将具有单元测试。