MSTest 未能通过 VS 2013 中的单元测试
MSTest fails Unit Test that passes in VS 2013
我一直在设置 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 路径的 Cake 方法
/// <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");
}
解决方案就是不要使用 Cake。回到 PS 解决方案。
我一直在设置 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 路径的 Cake 方法
/// <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");
}
解决方案就是不要使用 Cake。回到 PS 解决方案。