【发布时间】:2012-05-29 13:46:04
【问题描述】:
我有一个集成测试一直失败(在 Visual Studio 中),但是,通过查看数据库来验证结果表明这里测试的系统实际上是成功的。
这是测试的基本思路:
private static readonly EfContext db = new EfContext();
[TestMethod]
void Complete_System_Run_Through_Is_Successful()
{
// Create a new unique message and request...
var message = Guid.NewGuid().ToString();
var request = new FooRequest { Message = message };
var fooClient = null; /* WCF proxy */
try
{
// Call the service...
fooClient = new FooClient();
fooClient.CallService(fooRequest);
}
finally
{
// Close client or Abort faulted client...
var channel = fooClient as ICommunicationObject;
try
{
if (channel.State != CommunicationState.Faulted)
channel.Close();
}
catch { channel.Abort(); }
}
// Verify there are 15 instances (traces) present in the database...
var actualNumberOfTraces = db.Traces.Count(x => x.Message == message);
Assert.AreEqual(15, actualNumberOfTraces);
}
正在测试的 WCF 服务会触发一系列其他下游服务(想想“服务总线”),其中每个侦听服务都会向数据库添加一个条目(跟踪)。从头到尾,这个过程记录了每个完整系统运行中的 15 条这些痕迹。
验证数据库中的结果表明测试运行成功(数据库中存在所有 15 个跟踪)。但是,测试运行失败(在 Visual Studio 中),发现的实际跟踪数在 3-6 之间。我唯一能想到的是,Assert 被调用得太早(即数据库尚未完成更新)。
无论如何,一切正常,所有痕迹确实存在于数据库中,我只是在这个测试中遇到了问题。有什么建议吗?
【问题讨论】:
-
我会建议不要 try{... } finally{} 没有捕获(包含 Assert.Fail 如果在异常情况下需要什么?) - 或 wcf 代理的 using 块('fooclient')。有什么可以转移到测试开始或测试清理方法的吗?
-
我已更新代码示例以包含关闭/中止逻辑。这是关闭/中止 WCF 代理的首选方式,而不是 using 语句。基本上,try/finally 块用于处理关闭/中止,而不是异常。
-
我也会在外部尝试中放置一个 catch 块。
-
@Blam,同意,如果我想要处理异常,因为客户端调用了 one way 操作,所以我不想处理。从第一个 try 块中捕获异常不会增加任何价值。
-
如果 fooClient = new FooClient();或 fooClient.CallService(fooRequest);抛出你不想知道的错误?您仍然可以转发异常。
标签: c# .net sql-server wcf integration-testing