WCF / SQL Server的集成测试太慢了?

时间:2012-05-29 13:46:05

标签: c# .net sql-server wcf integration-testing

我有一个保持失败的集成测试(在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被调用得太早(即数据库尚未完成更新)。

无论如何,一切正常,数据库中确实存在所有痕迹,我只是遇到了这个测试的麻烦。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

看起来你有一个异步方法调用。本文描述了WCF同步和异步行为。

How to Call WCF Services Synchronously and Asynchronously

答案 1 :(得分:0)

暂时难看的解决方案是添加Thread.Sleep(250)以便让数据库有时间赶上来。如果您能想出更优雅的解决方案,我绝对有兴趣听到它!