如何将测试标记为JUnit 4中的预期故障?
在这种情况下,我想继续运行此测试,直到上游修补了一些内容.忽略测试有点太过分了,因为那时我可能会忘记它.我可能能够添加一个@expected注释并捕获抛出的异常assertThat,但这似乎也与预期的行为有关.
这是我目前的测试结果:
@Test
public void unmarshalledDocumentHasExpectedValue()
{
doc = unmarshaller.unmarshal(getResourceAsStream("mydoc.xml"));
final ST title = doc.getTitle();
assertThat(doc.getTitle().toStringContent(), equalTo("Expected"));
}
Run Code Online (Sandbox Code Playgroud)
该断言应该成功,但由于上游错误,它不会.然而,那个测试是正确的; 它应该成功.事实上,我发现的所有替代方案都具有误导性.现在我认为这@Ignore("This test should pass once fixed upstream")是我最好的选择,但我仍然要记得回到它.我更喜欢测试运行.
在Python中我可以使用expectedFailure装饰器:
class ExpectedFailureTestCase(unittest.TestCase):
@unittest.expectedFailure
def test_fail(self):
self.assertEqual(1, 0, "broken")
Run Code Online (Sandbox Code Playgroud)
使用Ct中的Qt QTestLib,您可以使用QEXPECT_FAIL:
QEXPECT_FAIL("", "Will be fixed next version", Continue);
QCOMPARE(i, 42);
Run Code Online (Sandbox Code Playgroud)
在上面的两种情况下,单元测试运行,这是我希望发生的.我在JUnit中遗漏了什么吗?
客户端不显眼验证对动态插入的表单字段有效所需的完整步骤是什么?
ASP.NET MVC 3使用动态内容进行不显眼的客户端验证 - 他需要在生成的HTML中显示不显眼的验证属性,并通过调用BeginForm
关于AjaxForm的ASP.Net MVC 3验证 - 提问者使用的Ajax.BeginForm是使用MicrosoftAjax而不是JQuery.validation.
PartialView和不显眼的客户端验证无法正常工作 - 他遇到了不显眼的验证属性的问题,这些属性没有显示和覆盖ViewContext.FormContext作为变通方法.
ASP.NET MVC 3:在布局上使用BeginForm时生成不显眼的验证 - 不显示在HTML中的不显眼的验证属性的解决方法
Brad Wilson 在ASP.NET MVC 3中的不引人注目的客户端验证
在伪代码中,这就是我正在做的事情:
Process proc = runtime.exec(command);
processOutputStreamInThread(proc.getInputStream());
processOutputStreamInThread(proc.getErrorStream());
proc.waitFor()
Run Code Online (Sandbox Code Playgroud)
但是,有时processOutputStreamInThread看不到任何输出,有时也看不到.粗略地说,该方法创建BufferedInputStream命令的输出并将其发送到记录器.
根据我所看到的,我猜,command不用有它的所有倒入美联储流输出getInputStream()和getErrorStream(),从而使流是空的.
我的试验结果如下:
(1)waitFor()在java.lang.Process中是否要求在返回之前读取已执行程序的输出?
文档仅说明:
如果需要,导致当前线程等待,直到此
Process对象表示的进程终止.如果子进程已终止,则此方法立即返回.如果子进程尚未终止,则调用线程将被阻塞,直到子进程退出.
(2)在什么条件下,流提供getInputStream并getErrorStream需要关闭和/或它们是否自动关闭?
文档仅说明:
获取子进程的错误流.该流获取从此Process对象表示的进程的错误输出流中传输的数据.
实现说明:缓冲输入流是个好主意.
一个用户报告说他必须自己关闭流,但是我至少在一部分时间内得到一个异常,表明当我尝试这样做时,流已经关闭.
编辑:改getOutputStream到getInputStream,现在提出上述.
解决方案:问题最终导致在某些情况下,用于处理输出流的线程在我的非常短暂的进程完成之后才会运行,从而导致输入流不给我任何数据. waitFor没有等待执行程序的输出.相反,程序在收集任何输出之前运行并终止.
我使用线程是因为我不确定我将在标准错误和标准输出上获得多少输出,并且我希望能够同时处理两个,而不会阻塞其中一个或者只有其中一个有可用数据.但是,因为我的线程无法一致地读取执行程序的输出,所以这是一个非解决方案.
我的最终编码看起来像这样:
ProcessBuilder pb = new ProcessBuilder(cmdargs);
pb.redirectErrorStream(true);
Process proc = pb.start();
processOutputStream(proc.getInputStream());
proc.waitFor()
Run Code Online (Sandbox Code Playgroud) 为了填写一些细节,我目前正在尝试更新AutofacContrib.Moq以使用最新的Moq.对于.NET-3.5及以下版本,我没有遇到任何问题.但在.NET-4中,安全限制会导致许多安全异常.
Moq有一个单一的方法,GetObjectData用SecurityCritical属性标记.AutofacContrib.Moq具有AllowPartiallyTrustedCallers属性集,该属性是异常的来源.似乎不是添加SecurityRulesSecurityLevel为1 的属性,而是最好删除AllowPartiallyTrustedCallers属性.我相信这默认会使程序集SecurityTransparent,这可能是不够的(尽管AutofacContrib.Moq单元测试通过).
我目前的主要问题是,针对.NET-4的程序集是否应该使用AllowPartiallyTrustedCallers属性?但是,鉴于我绝对不了解所有内容,在使用安全标记的程序集时应该考虑哪些细节?我是否需要在其使用的那些地方,直接或间接地使用安全属性明确标记我的程序集SecurityCritical?
与C#的这个线程类似,我需要将包含命令行参数的字符串拆分到我的程序中,这样我就可以让用户轻松运行多个命令.例如,我可能有以下字符串:
-p /path -d "here's my description" --verbose other args
Run Code Online (Sandbox Code Playgroud)
鉴于上述情况,Java通常会将以下内容传递给main:
Array[0] = -p
Array[1] = /path
Array[2] = -d
Array[3] = here's my description
Array[4] = --verbose
Array[5] = other
Array[6] = args
Run Code Online (Sandbox Code Playgroud)
我不需要担心任何shell扩展,但它必须足够聪明,以处理单引号和双引号以及字符串中可能存在的任何转义.有没有人知道在这些条件下shell会解析字符串的方法?
注:我不是需要做的命令行解析,我已经使用joptsimple做到这一点.相反,我想让我的程序易于编写脚本.例如,我希望用户能够在一个文件中放置一组命令,每个命令在命令行上都是有效的.例如,他们可能会在文件中键入以下内容:
--addUser admin --password Admin --roles administrator,editor,reviewer,auditor
--addUser editor --password Editor --roles editor
--addUser reviewer --password Reviewer --roles reviewer
--addUser auditor --password Auditor --roles auditor
Run Code Online (Sandbox Code Playgroud)
然后用户将运行我的管理工具,如下所示:
adminTool --script /path/to/above/file
Run Code Online (Sandbox Code Playgroud)
main()然后会找到该--script选项并迭代文件中的不同行,将每一行拆分成一个数组,然后我将在一个joptsimple实例中反射,然后将该数据传递给我的应用程序驱动程序.
joptsimple附带了一个具有解析方法的Parser ,但它只支持一个String …
如何根据特定条件(例如文件扩展名或项目元数据)过滤现有ItemGroup?
对于此示例,我将使用文件扩展名.我正在尝试过滤由VS定义的'None'ItemGroup,以便我的目标可以对给定扩展名的所有文件进行操作.
例如,可以定义以下内容:
<ItemGroup>
<None Include="..\file1.ext" />
<None Include="..\file2.ext" />
<None Include="..\file.ext2" />
<None Include="..\file.ext3" />
<None Include="..\file.ext4" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
我想过滤上面的'None'ItemGroup,因此它只包含ext扩展名.请注意,我不希望指定所有扩展排除,因为他们会每个项目各不相同,我试图让我的目标可重复使用而无需修改.
我试过Condition在目标中添加一个:
<Target Name="Test">
<ItemGroup>
<Filtered
Include="@(None)"
Condition="'%(Extension)' == 'ext'"
/>
</ItemGroup>
<Message Text="None: '%(None.Identity)'"/>
<Message Text="Filtered: '%(Filtered.Identity)'"/>
</Target>
Run Code Online (Sandbox Code Playgroud)
但遗憾的是,它不起作用.我得到以下输出:
Test:
None: '..\file1.ext'
None: '..\file2.ext'
None: '..\file.ext2'
None: '..\file.ext3'
None: '..\file.ext4'
Filtered: ''
Run Code Online (Sandbox Code Playgroud) 当我为webapp构建部署包时,该包包含一个archive.xml文件,其中包含以下内容:
<createApp
applicationPool=""
MSDeploy.applicationPool="1"
appExists="True"
MSDeploy.appExists="1"
... />
Run Code Online (Sandbox Code Playgroud)
如何控制安装webapp的应用程序池,并在某些情况下创建新的应用程序池?是否有VS设置我可以更改以控制上述输出或以其他方式影响应用程序池在部署时的方式?
根据一篇SO帖子,我可以通过添加以下选项告诉msbuild使用应用程序池,但我看不出生成的输出有任何区别:
/p:IncludeAppPool=true
Run Code Online (Sandbox Code Playgroud)
关于为msdeploy设置应用程序池的另一篇文章似乎暗示我可能能够修改生成的parameters.xml文件,以便我可以将应用程序池名称指定为msdeploy的参数.此文件存在于zip包中,因此不容易自定义.如果我将其更改为存档,则文件更容易访问.
该HOWTO部署web应用程序页面似乎暗示我可能需要从IIS快速切换到IIS,然后再启用一些复选框.在我的项目属性页面上,Include application pool settings used by this Web project无论"在IIS Express中配置了包含IIS设置"复选框设置(我目前尚未选中),都会禁用该复选框.我将尝试切换到下一个完整的IIS,看看是否能让我更好地控制.
看起来我可以用一个单独的工具创建一个应用程序池,但我不确定它是否只是TFS.这是我以前从未见过的工具,但它可能是一个功能强大的工具.
MSDeploy的appPoolConfig提供程序看起来很有前途,因为我可以手动设置一个应用程序池,然后将其用作同步源,但至少它只是手动一次.
我最近意识到我并不完全理解Java的字符串编码过程.
请考虑以下代码:
public class Main
{
public static void main(String[] args)
{
System.out.println(java.nio.charset.Charset.defaultCharset().name());
System.out.println("ack char: ^"); /* where ^ = 0x06, the ack char */
}
}
Run Code Online (Sandbox Code Playgroud)
由于控制字符在windows-1252和ISO-8859-1之间的解释不同,我选择了ackchar进行测试.
我现在用不同的文件编码,UTF-8,windows-1252和ISO-8859-1编译它.两者都编译为完全相同的事情,每个字节的字节经过验证md5sum.
然后我运行程序:
$ java Main | hexdump -C
00000000 55 54 46 2d 38 0a 61 63 6b 20 63 68 61 72 3a 20 |UTF-8.ack char: |
00000010 06 0a |..|
00000012
$ java -Dfile.encoding=iso-8859-1 Main | hexdump -C
00000000 49 …Run Code Online (Sandbox Code Playgroud) 我正在尝试将接口绑定到其实现,从配置文件中读取,以便我可以将其提供给我的IoC容器.这大致是我正在尝试做的事情:
public class PropertyImplementationBinder<T> {
// ...
public Class getInterfaceClass() {
return T.class; // OR Class<T>, note T is not newable
}
public Class getImplementationClass() {
return /* read config file to get implementation class */;
}
}
Run Code Online (Sandbox Code Playgroud)
是不是有可能得到T.class?
当使用依赖注入(DI)和控制反转(IoC)时,对象通常会有一个构造函数,它接受对象正常运行所需的依赖集.
例如,如果我有一个需要服务来填充组合框的表单,您可能会看到如下所示的内容:
// my files
public interface IDataService {
IList<MyData> GetData();
}
public interface IComboDataService {
IList<MyComboData> GetComboData();
}
public partial class PopulatedForm : BaseForm {
private IDataService service;
public PopulatedForm(IDataService service) {
//...
InitializeComponent();
}
}
Run Code Online (Sandbox Code Playgroud)
这在顶级工作正常,我只是使用我的IoC容器来解决依赖关系:
var form = ioc.Resolve<PopulatedForm>();
Run Code Online (Sandbox Code Playgroud)
但面对生成的代码,这会变得更难.在winforms中,生成组成其余部分类的第二个文件.此文件引用其他组件(如自定义控件),并使用no-args构造函数来创建此类控件:
// generated file: PopulatedForm.Designer.cs
public partial class PopulatedForm {
private void InitializeComponent() {
this.customComboBox = new UserCreatedComboBox();
// customComboBox has an IComboDataService dependency
}
}
Run Code Online (Sandbox Code Playgroud)
由于这是生成的代码,我无法传递依赖项,并且没有简单的方法让我的IoC容器自动注入所有依赖项.
一种解决方案是传递每个子组件的依赖关系,PopulatedForm即使它可能不需要它们直接,例如使用IComboDataService所需的UserCreatedComboBox.然后,我有责任确保通过各种属性或setter方法提供依赖项.然后,我的PopulatedForm构造函数可能如下所示:
public PopulatedForm(IDataService …Run Code Online (Sandbox Code Playgroud) c# code-generation dependency-injection inversion-of-control winforms
java ×5
c# ×2
.net-4.0 ×1
asp.net-mvc ×1
autofac ×1
filtering ×1
generics ×1
inputstream ×1
junit ×1
moq ×1
msbuild ×1
msdeploy ×1
parsing ×1
process ×1
security ×1
string ×1
type-erasure ×1
unit-testing ×1
winforms ×1