如何在运行时识别预期异常,同时进行单元测试?
问题描述:
我正在测试一个调用函数的WCF应用程序。我需要测试这个功能。我正在为它创建代理,并且当我尝试单元测试该方法时,会生成一些异常。我尝试了下面的代码,但由于异常而无法测试该方法。 请考虑生成的异常类型不固定。如何在运行时识别预期异常,同时进行单元测试?
[TestMethod]
[ExpectedException(typeof(Exception),"A Exception is been Generated.")]
public void TestMethodProxy()
{
IServiceProxy obj=new ServiceProxy();
bool result=obj.DisplayMessage();
Assert.IsTrue(result);
}
请提出了一些很好的解决方案..在此先感谢....
答
您的代码不会是一个非常有价值的单元测试,纯粹是因为你同时tesing多个单位:
- WCF客户端
- 传输到服务
- 服务信息格式化程序(包括序列化和反序列化)
- WCF服务主机
- 您的基于WCF的服务。
这直接导致了你的问题:如果你一次测试多个单元,你怎么能确定哪个单元失败?
答案是:你的单元测试应该测试单元。
如果您想测试服务的内部功能,只需在WCF主机环境之外创建该服务的新实例并单元测试即可。如果您想测试您的托管和配置,请创建一个模拟服务,将其托管在WCF中,并使用可靠的客户端调用该服务。
如果你想让他们给你有用的信息,你需要将你的测试分解成独立的单位。
答
我会把一个尝试捕捉在测试本身并处理所有不同情况的方式。你有这样更精细的控制
然后,您可以做一个Assert.Fail如果正确的异常没有在测试中抓
try
{
//Run code that throws exception
}
catch(SpecificException ex)
{
//Assert ex for more details if needed
return;
}
Assert.Fail();
答
单元测试WCF服务不紧靠测试代理刚刚确认WCF内部工作与否。你应该测试的是你的服务方法,只需简单地新服务和测试它的方法。在这里,您可以测试您的服务可能抛出的预期异常。
“单位”是一个观点问题。 我保证我可以将您曾经写入不同层次依赖关系的任何单元测试挑出来,就像您在这里完成的一样。 – Bon 2014-04-29 17:50:31
这里的教训不是创建间接的冗余级别,而是简单地观察分离到较小单元的位置,从而更容易地隔离和识别问题的原因。 – 2014-04-30 00:08:11
我同意这一点,但认为部分总和等于整体并不总是对的。 我的意思是,尽管进行粒度测试很重要,但我认为同样重要的是,您可以快速并重复地执行将配置和网络条件合并到单个“单元”范围内的测试。 – Bon 2014-05-01 02:16:54