目前我正在使用 WicketTester 的 startPanel 方法来测试我的面板。在这些面板中,我经常使用 PageParameters 来访问数据,使用 getPage().getPageParameters()。但是,startPanel 方法不会为 DummyPage 初始化任何页面参数,也没有为我提供设置页面参数的功能。
如何在面板测试期间设置我的页面参数?
目前我正在使用 WicketTester 的 startPanel 方法来测试我的面板。在这些面板中,我经常使用 PageParameters 来访问数据,使用 getPage().getPageParameters()。但是,startPanel 方法不会为 DummyPage 初始化任何页面参数,也没有为我提供设置页面参数的功能。
如何在面板测试期间设置我的页面参数?
就个人而言,我认为,获得PageParameters通孔getPage().getPageParameters()是一种次优的方式。
如您所见,它将面板从您的面板引入到您的页面,这使得它们紧密耦合并且难以测试。
如果您需要PageParameters从您的内部访问,请Panel通过创建一个接受这些的构造函数来注入它们,类似于
private PageParameters params;
public MyPanel (String id, Model<T> model, PageParameters params) {
super(id, model);
this.params = params;
...
}
这样,您可以在测试中使用Parameters您可以想象的任何东西来Panel构造 ,并且避免了被证明是不利的耦合。PanelPageParameters
真的是这样吗?startPanel 已经为我们创建了一个虚拟页面,但没有任何页面参数。使用您的方法将面板附加到两个页面,这对我来说似乎不是最佳解决方案。现在我用 startPanel(Panel, PageParameters) 函数扩展了 WicketTester:
public Panel startPanel(final TestPanelSource testPanelSource, final PageParameters parameters) {
return (Panel) startPage(new ITestPageSource() {
public Page getTestPage() {
return new DummyPanelPage(testPanelSource, parameters);
}
}).get(DummyPanelPage.TEST_PANEL_ID);
}
并使用页面参数构造器创建了一个新的虚拟面板页面
public class DummyPanelPage extends WebPage {
/**
* The dummy <code>Panel</code> <code>Component</code> id.
*/
public static final String TEST_PANEL_ID = "panel";
/**
* Default constructor.
* @param testPanelSource <code>TestPanelSource</code>
*/
public DummyPanelPage(final TestPanelSource testPanelSource, final PageParameters parameters) {
super(parameters);
add(testPanelSource.getTestPanel(TEST_PANEL_ID));
}
}
这让我很惊讶,为什么 Apache 不只是开箱即用地提供了这个功能。
您可以在已创建页面和面板的情况下使用 TestPanelSource 的匿名(或子类)。
final WebPage parameterPage = new WebPage(pageParmeters);
final Panel panelUnderTest = .... create panel here ....;
parameterPage.add(panelUnderTest);
wicketTester.startPanel(new TestPanelSource(){
public Panel getTestPanel(final String panelId) {
return panelUnderTest;
}
});
如果您经常使用它,那么 TestPanelSource 的子类可能最好能够将参数传递给您的子类的构造函数和您感兴趣的其他可配置项目。