我正在为intellij平台(实际上是phpstorm)开发一个插件。
我的插件在php语言的字符串文本表达式中提供引用。我创建了一个引用贡献者和几个引用提供者类。当我在phpstorm中运行插件时,它运行得非常好。
我的插件变大了,所以我决定为它写一些测试。我使用intellij idea“createtest”操作创建了一个单元测试,并选择了junit3。当我运行test(参见下面的代码)时,类 MyPsiReferenceContributor
根本没有被访问,测试预期会失败(“测试失败”)。 parent.getReferences()
返回空数组( parent
是stringliteralexpressionimpl的示例。
似乎是这样 MyPsiReferenceContributor
未在测试环境中注册。
我应该怎么做才能使我的参考贡献者在测试中可用?
我用了这个项目https://github.com/haehnchen/idea-php-symfony2-plugin 举个例子,但是我的插件不像他们那样使用gradle。
我就是这样注册我的参考投稿人的 plugin.xml
:
<extensions defaultExtensionNs="com.intellij">
<psi.referenceContributor implementation="com.zenden2k.MyFrameworkIntegration.MyPsiReferenceContributor"/>
</extensions>
这是我的参考撰稿人:
public class MyPsiReferenceContributor extends PsiReferenceContributor {
// This is not being called while running tests! :(
@Override
public void registerReferenceProviders(PsiReferenceRegistrar registrar) {
MyPsiReferenceProvider provider = new MyPsiReferenceProvider();
registrar.registerReferenceProvider(StandardPatterns.instanceOf(StringLiteralExpression.class), provider);
}
}
这是我的测试用例:
package com.zenden2k.MyFrameworkIntegration.tests;
import com.intellij.patterns.ElementPattern;
import com.intellij.patterns.PlatformPatterns;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiReference;
import com.intellij.testFramework.fixtures.BasePlatformTestCase;
public class MyPsiReferenceContributorTest extends BasePlatformTestCase {
public void setUp() throws Exception {
super.setUp();
myFixture.copyFileToProject("GetStaticDatasourceFixture.php");
myFixture.copyFileToProject("user.xml");
}
protected String getTestDataPath() {
return "src/test/com/zenden2k/MyFrameworkIntegration/tests/fixtures";
}
public void testThatStaticDatasourceReferenceIsProvided() {
final ElementPattern<?> pattern = PlatformPatterns.psiElement().withName("test");
myFixture.configureByText("user.php",
"<?php \n" +
"class MyClass extends CXMLObject {\n" +
" public function test() {\n" +
" $this->getStaticDatasource('t<caret>est');\n" +
" }\n" +
"}\n"
);
PsiElement psiElement = myFixture.getFile().findElementAt(myFixture.getCaretOffset());
if (psiElement == null) {
fail("Fail to find element in caret");
}
PsiElement parent = psiElement.getParent();
final PsiReference[] ref = parent.getReferences();
for (PsiReference reference : ref) {
PsiElement element = reference.resolve();
if (pattern.accepts(element)) {
return;
}
}
fail("Test failed");
}
}
1条答案
按热度按时间ou6hu8tu1#
首先,推荐使用gradle开发插件。你可以查看gradle docs部分的构建插件以了解更多细节。
intellij平台sdk代码示例库中提供了一个简单的语言示例项目,该项目涵盖了psi引用的测试。