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

C# WCF/SQL Server的集成测试太慢?,c#,.net,sql-server,wcf,integration-testing,C#,.net,Sql Server,Wcf,Integration Testing,我有一个集成测试一直失败(在VisualStudio中),但是,通过查看数据库来验证结果表明这里测试的系统实际上是成功的 这是测试的基本思想: private static readonly EfContext db = new EfContext(); [TestMethod] void Complete_System_Run_Through_Is_Successful() { // Create a new unique message and request... var

我有一个集成测试一直失败(在VisualStudio中),但是,通过查看数据库来验证结果表明这里测试的系统实际上是成功的

这是测试的基本思想:

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
调用得太早(即数据库尚未完成更新)


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

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


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


目前最糟糕的解决方案是添加一个
线程。Sleep(250)
,让数据库有时间跟上进度。如果你能想出一个更优雅的解决方案,我绝对有兴趣听到它

目前最糟糕的解决方案是添加一个
线程.Sleep(250)
,让数据库有时间跟上进度。如果你能想出一个更优雅的解决方案,我绝对有兴趣听到它

我建议不要在没有catch(包含Assert.Fail,如果这是异常情况下需要的?)或wcf代理('fooclient')的using块的情况下尝试{…}finally{}。有什么可以转移到测试开始或测试清理方法吗?我已经更新了代码示例以包含关闭/中止逻辑。这是关闭/中止WCF代理的首选方法,而不是using语句。基本上,try/finally块用于处理关闭/中止,而不是异常。我也会在外部try中放置一个catch块。@Blam,同意,如果我想处理异常,我不会这样做,因为客户端调用单向操作。从第一个try块捕获异常不会增加任何值;或fooClient.CallService(fooRequest);抛出一个您不想知道的错误?您仍然可以转发异常。我建议不要在没有catch(包含Assert.Fail,如果这是异常情况下所需的内容?)或wcf代理('fooclient')的using块的情况下尝试{…}finally{}。有什么可以转移到测试开始或测试清理方法吗?我已经更新了代码示例以包含关闭/中止逻辑。这是关闭/中止WCF代理的首选方法,而不是using语句。基本上,try/finally块用于处理关闭/中止,而不是异常。我也会在外部try中放置一个catch块。@Blam,同意,如果我想处理异常,我不会这样做,因为客户端调用单向操作。从第一个try块捕获异常不会增加任何值;或fooClient.CallService(fooRequest);抛出一个您不想知道的错误?您仍然可以转发异常。它是异步的,因为这些服务使用MSMQ绑定/(单向操作)。真的,我只是想知道这个测试是否真的能通过。我开始认为不会,因为这些断开连接的服务的性质。使用asynch,你不应该期望它通过,所以我不知道它如何增加任何价值。我认为您需要一种不同的方法来测试它。它是异步的,因为这些服务使用MSMQ绑定/(单向操作)。真的,我只是想知道这个测试是否真的能通过。我开始认为不会,因为这些断开连接的服务的性质。使用asynch,你不应该期望它通过,所以我不知道它如何增加任何价值。我认为您需要一种不同的方法来测试这一点。更好的方法是等待,并在循环中多次尝试断言,只要您认为合理(比如最多30秒)。在代码中加入abitrary sleep会使测试不确定,并且会在不同规格的机器上失败。这是一个好主意,您可以发布一个示例,说明如何执行任务[],WaitAll()在循环中调用Assert,就像您所说的那样?一个更好的方法是等待,并在循环中多次尝试断言,只要你认为合理(比如最多30秒)。在代码中加入abitrary sleep会使测试不确定,并且会在不同规格的机器上失败。这是一个好主意,您可以发布一个示例,说明如何执行任务[],WaitAll()在循环中调用Assert,就像您所说的那样?只是为了让我快点开始?