【问题标题】:MSTest fails Unit Test that passes in VS 2013MSTest 未能通过 VS 2013 的单元测试
【发布时间】:2015-04-04 06:05:03
【问题描述】:

我一直在设置 Cake 脚本 (C# Make) 以准备自动化我们的单元测试。我已经设置了脚本,它正在按预期运行单元测试,除了一个怪癖......

当 MSTest 尝试执行它时,其中一个更简单的测试失败了,但当我从 VS 2013 运行测试时,它却以优异的成绩通过。

            [TestMethod]
        public void Field_is_XmlNode_innertext_urlencode()
        {
            // Arrange
            var xmlDoc = new XmlDocument();
            xmlDoc.LoadXml("<field>\"'#</field>");
            var fetchedField = xmlDoc.SelectSingleNode("field");

            // Assert
            Assert.AreEqual("%22%27%23", CrmHelpers.GetFetchedFieldValueAsString(fetchedField, null, true));
        }

调用 MSTest 的 Cake 脚本部分。

Task("RunTests")
.IsDependentOn("Build")
.Does(() =>
{
    Information("TestPath {0}", "./Tests/Unit Tests/**/bin/" + configuration + "/*.UnitTests.dll");
    MSTest("./Tests/Unit Tests/**/bin/" + configuration + "/*.UnitTests.dll");
});

在 VS2013 中,值 \"'# 被正确编码为 %22%27%23,但是当通过 Cake 调用 MSTest 执行测试时,相同的值被编码为 %22'%23。

我的问题是:为什么这些值在 MSTest 中的编码与我在 VS2013 中看到的不同,而理论上它应该运行相同的代码? 如何更正此问题,以便 MSTest 以可预测且一致的方式运行我的所有单元测试?

编辑 1:添加请求的方法

 public static string GetFetchedFieldValueAsString(XmlNode fetchedField, string format, bool urlEncode)
    {
        var fieldValue = "";

        if (format.IsNotEmpty())
        {
            try
            {
                if (fetchedField.Attributes["date"] != null)
                {
                    var date = DateTime.Parse(fetchedField.InnerText).ToUniversalTime();
                    fieldValue = GetFormatedDateAsString(date, format);
                }
                else if (fetchedField.InnerText.IsNumeric())
                {
                    var number = float.Parse(fetchedField.InnerText);
                    fieldValue = number.ToString(format);
                }
            }
            catch
            {
                // Ignore formating errors
            }
        }

        if (fieldValue.IsEmpty()) fieldValue = fetchedField.GetAttributeValue("name");
        if (fieldValue.IsEmpty()) fieldValue = fetchedField.GetAttributeValue("formattedvalue");
        if (fieldValue.IsEmpty() && fetchedField.Attributes["date"] != null)
        {
            var date = fetchedField.GetAttributeValue("date");
            var time = fetchedField.GetAttributeValue("time");
            if (date.IsNotEmpty()) fieldValue = date;
            if (date.IsNotEmpty() && time.IsNotEmpty()) fieldValue += " ";
            if (time.IsNotEmpty()) fieldValue += time;
        }
        if (fieldValue.IsEmpty()) fieldValue = fetchedField.InnerText;
        if (fieldValue.IsGuid()) fieldValue = fieldValue.Replace("{", "").Replace("}", "");
        fieldValue = fieldValue.Sanitize();
        if (urlEncode) fieldValue = fieldValue.UrlComponentEncode();
        return fieldValue;
    }

编辑 2:添加请求的方法

    public static string UrlComponentEncode(this string s)
    {
        return Uri.EscapeDataString(s);
    }

编辑 3:获取 MSTest 路径的蛋糕方法

    /// <summary>
    /// Gets the default tool path.
    /// </summary>
    /// <returns>The default tool path.</returns>
    protected override FilePath GetDefaultToolPath(MSTestSettings settings)
    {
        foreach (var version in new[] { "12.0", "11.0", "10.0" })
        {
            var path = GetToolPath(version);
            if (_fileSystem.Exist(path))
            {
                return path;
            }
        }
        return null;
    }

    private FilePath GetToolPath(string version)
    {
        var programFiles = _environment.GetSpecialPath(SpecialPath.ProgramFilesX86);
        var root = programFiles.Combine(string.Concat("Microsoft Visual Studio ", version, "/Common7/IDE"));
        return root.CombineWithFilePath("mstest.exe");
    }

【问题讨论】:

  • 您必须显示GetFetchedFieldValueAsString 方法,因为这显然是您正在测试的内容。
  • 现在添加 UrlComponentEncode() 实现,因为这是在构建服务器上返回不同内容的方法。
  • @Dirk 添加了第二种方法
  • 我曾经在回答另一个问题stackoverflow.com/questions/22013879/… 时深入探讨过这个话题。我发现 EscapeDataString 在 .NET 4.5 中已更改。也许您的 2 个测试针对不同的版本。
  • 看起来确实很相似。 ' 是问题的孩子,但是我在 VS 中运行 .NET 4.5 并且从那里运行时它可以工作。也许我不完全理解,但这似乎与预期的行为相反。我不确定如何检查正在运行的 .NET MSTest 版本或如何配置它。我会自己研究它,但如果您对此有任何见解,我将不胜感激。谢谢。

标签: c# unit-testing encoding mstest


【解决方案1】:

解决方案就是不要使用 Cake。回到 PS 解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    相关资源
    最近更新 更多