【问题标题】:RestSharp - when a test runs for the first time, it fails. When I debug, it passes. what's going on?RestSharp - 第一次运行测试时,它会失败。当我调试时,它通过了。这是怎么回事?
【发布时间】:2013-05-26 03:22:55
【问题描述】:

相当基本的测试:

[TestClass]
public class ApiClientTest
{
    private RestClient _client;

    [TestInitialize()]
    public virtual void TestInitialize()
    {
        _client = new RestClient("http://localhost:24144");
        _client.CookieContainer = new System.Net.CookieContainer();
    }

    [TestMethod]
    public void ApiClientTestCRUD()
        {
        // 1. Log out twice.  Verify Unauthorized.
        var response = LogOut();
        response = LogOut();
        Assert.AreEqual(response.StatusCode, HttpStatusCode.Unauthorized);
        // Error here: 

结果消息:Assert.AreEqual 失败。预期:。 实际:。

我得到 ,这甚至不是我的 WebAPI 返回的东西。

我认为问题在于我对 RestSharp 的使用,因为如果我调试一次它就会通过,然后后续运行就会通过。有什么线索吗?

需要说明的是 - 当我打开我的解决方案并第一次尝试运行测试时会发生这种情况。我可以通过调试一次来修复它,看着它通过,然后在不调试的情况下运行我想要的。我可以通过关闭 VS 并再次打开解决方案来重现这一点 - 并在不先调试的情况下运行测试。

这是我的 WebAPI 中的 LogOut 方法:

    [Authorize]
    public HttpResponseMessage LogOut()
    {
        try
        {
            if (User.Identity.IsAuthenticated)
            {
                WebSecurity.Logout();
                return Request.CreateResponse(HttpStatusCode.OK, "logged out successfully.");
            }
            return Request.CreateResponse(HttpStatusCode.Conflict, "already done.");
        }
        catch (Exception e)
        {
            return Request.CreateResponse(HttpStatusCode.InternalServerError, e);
        }

    }

更新:

我最终使用 Trace.WriteLine 运行测试:

        // 1. Log out twice.  Verify Unauthorized.
        Trace.WriteLine("ENTERING FIRST LOGOUT");
        var response = LogOut();
        Trace.WriteLine("Content: " + response.Content);
        Trace.WriteLine("ErrorMessage: " + response.ErrorMessage);
        Trace.WriteLine("ResponseStatus: " + response.ResponseStatus);
        Trace.WriteLine("StatusCode: " + response.StatusCode);
        Trace.WriteLine("StatusDescription: " + response.StatusDescription);
        response = LogOut();
        Trace.WriteLine("COMPLETED LOGOUTS");
        Assert.AreEqual(response.StatusCode, HttpStatusCode.Unauthorized);

我发现了以下内容:

ENTERING FIRST LOGOUT
Content: 
ErrorMessage: Unable to connect to the remote server
ResponseStatus: Error
StatusCode: 0
StatusDescription: 
COMPLETED LOGOUTS

我的解决方案有一个带有此 RestSharp 测试的测试项目,以及一个应该接受这些请求的 WebAPI 项目。如果我调试,RestClient 会连接。如果没有,则超时。有什么建议吗?

【问题讨论】:

  • User.Identity 来自静态的 Thread.CurrentPrincipal。如果它在一个测试中被修改,会影响其余的测试。这可能是这里的问题。当您运行多个测试时,您可能会有一个或多个测试修改该静态变量。
  • 没有其他测试正在运行...只有这个。

标签: asp.net-web-api restsharp


【解决方案1】:

当调试无法解决问题时,请使用旧方式。

添加 Trace.WriteLine(甚至将文本附加到 C:\temp.txt 文件)。

在 LogOut 方法的每次返回之前写一些字符串,然后尝试写更多信息(如果是最后一次返回则写异常消息,如果是第二次返回则写身份信息。

希望这会有所帮助。

【讨论】:

  • 谢谢,这确实有帮助。我用结果更新了我的问题,你有机会看看吗?
  • 很抱歉,我没有看到足够的信息来为您提供适当的解决方案。为什么跟踪输出只有 3 行?你可以给每个 Trace.WriteLine("1" + first)、Trace.WriteLine("2" + second) 等编号,以便我们可以看到消息来自哪里? localhost:24144 在哪里?它来自同一个解决方案吗?它是在第一次运行测试时创建的吗?可以单独调试吗?
  • 更新了更多细节。本地主机来自同一个解决方案 - 它是 WebAPI 项目。我不能单独调试它......我发布了另一个问题以防你想在那里回答:stackoverflow.com/questions/16629388/…
  • 您确定不能将您的测试与 WebAPI 分开吗?我可以猜到,在调试中运行时,目标在 Visual Studio 加载符号时加载,而在没有调试的情况下运行时,它无法及时加载,也许你可以以某种方式更改 RestClient (或 WebAPI 端点的超时) )。在这里发现了类似的问题:answers.yahoo.com/question/index?qid=20110117051325AA6nh2Q
  • 我会将我的 WebAPI 测试移动到我的客户端解决方案中(使用 WebAPI)并回发。感谢您的帮助
【解决方案2】:

您如何托管服务器?我看到你正在使用端口 24144。也许在调试模式下你正在运行 express IIS Web 服务器,这就是端口,但在非调试模式下它不是?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-09
    • 2021-05-17
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    • 2021-01-20
    • 1970-01-01
    相关资源
    最近更新 更多