在WinForms中使用MVP模式时,我遇到了一些场景,在这些场景中,我在Presenter
的公共方法中调用了一些私有方法,并更改了View的一些属性。
如何有效地对这些情况进行单元测试?
public void OnFileNameChanged(string fileName)
{
_settings = FirstPrivateOperation()
if (_settings == null)
{
_view.A = false;
return;
}
var config = SecondPrivateOperation();
if (config == null)
{
_view.B = true;
return;
}
_view.C = true;
}
答案 0 :(得分:1)
根据您显示的内容,一些选项是:
_settings
和config
或什至将结果提供到一个单独的类中的两个方法(如配置类的东西),并将该类的接口作为依赖项注入到任何级别说得通。然后,您可以模拟这些值。 我会选择其中一种选择。
关于View值,我会尝试将其分开。这段代码有很多问题。
OnFileNameChanged
方法,您可能无法更改其签名并且不返回任何内容。因此,我将进一步分离代码。删除其中的代码,然后创建另一个您可以控制的方法。不要在该设置中添加任何“视图”设置。目的是要覆盖逻辑并返回带有一些计算值的对象。
然后,在OnFileNameChanged
中分配所需的视图内容。简而言之,将逻辑部分移出并在其他地方处理并进行测试。您有3个值要分配给View对象,因此使您的新方法返回一个值或一个包含三个值的对象,涵盖每种可能性。
public void OnFileNameChanged(string fileName)
{
var calculatedValues = CalculateValues(//might need some params here)
_view.A = calculatedValues.A;
_view.B = calculatedValues.B;
_view.C = calculatedValues.C;
}
public MyReturnType CalculateValues()
{
var result = new MyReturnType();
var config = FirstPrivateOperation();
if ( config == null ) { return result; }
//etc etc
}
public MyReturnType
{
public Whatever A { get;set }
public Whatever B { get;set }
public Whatever C { get;set }
}
您甚至可以走得更远,以不同的方式处理私有方法。您可能想添加一个单独的类来替换它们,然后使主题也更易于测试/模拟。