上下文
在XUnit github中我发现了这个:Add Assert.Equal(expected, actual, message) overload #350 (所以开发人员要求不存在的重载请参见下文)
引用答案:
我们相信自我记录的代码;包括你的断言。
(因此XUnit团队拒绝了它)
好的,我明白了。我也相信自我记录代码。我还是找不到 这个用例:
示例
// Arrange
// Create some external soap service client and its wrapper classes
// Act
// client.SomeMethod();
// Assert
// Sorry, soap service's interface, behaviour and design is *given*
// So I have to check if there is no Error, and
// conveniently if there is, then I would like to see it in the assertion message
Assert.Equal(0, client.ErrorMessage.Length); // Means no error
// I would like to have the same result what would be the following *N*U*n*i*t* assert:
// Assert.AreEqual(0, client.ErrorMessage.Length, client.ErrorMessage); // Means no error
问题
如何在XUnit中实现描述性断言消息,但仍然没有这样的重载?
答案 0 :(得分:14)
使用链接提供的建议。与fluent assertions类似,或者创建自己的断言,将Assert.True or Assert.False
包含在其消息重载中。
有人进一步提到
您可以向Assert.True和.False提供消息。如果你只是 不能没有消息(并拒绝使用不同的消息) 断言),你总是可以回到:
Assert.True(number == 2, "This is my message");
如果你真的想要留言,你可以添加Fluent Assertions或者也许 xbehave 到您的测试项目并使用他们的语法。 如果它遇到它的存在,Fluent Assertions甚至会抛出xunit.net异常。
答案 1 :(得分:4)
我遇到了同样的问题。我有一个测试,该测试从两个Web API提取数据,然后比较并声明有关内容的各种信息。我开始使用标准的XUnit断言,例如:
Assert.Equal(HttpStatusCode.OK, response1.StatusCode);
Assert.Equal(HttpStatusCode.OK, response2.StatusCode);
但是,尽管这给出了一条有用的消息,表明已返回404,但无法从我们的build / CI服务器上的日志中清除是哪个服务导致了错误消息。
我最终添加了自己的断言来提供上下文:
public class MyEqualException : Xunit.Sdk.EqualException
{
public MyEqualException(object expected, object actual, string userMessage)
: base(expected, actual)
{
UserMessage = userMessage;
}
public override string Message => UserMessage + "\n" + base.Message;
}
public static class AssertX
{
/// <summary>
/// Verifies that two objects are equal, using a default comparer.
/// </summary>
/// <typeparam name="T">The type of the objects to be compared</typeparam>
/// <param name="expected">The expected value</param>
/// <param name="actual">The value to be compared against</param>
/// <param name="userMessage">Message to show in the error</param>
/// <exception cref="MyEqualException">Thrown when the objects are not equal</exception>
public static void Equal<T>(T expected, T actual, string userMessage)
{
bool areEqual;
if (expected == null || actual == null)
{
// If either null, equal only if both null
areEqual = (expected == null && actual == null);
}
else
{
// expected is not null - so safe to call .Equals()
areEqual = expected.Equals(actual);
}
if (!areEqual)
{
throw new MyEqualException(expected, actual, userMessage);
}
}
}
然后我可以执行与以下相同的断言:
AssertX.Equal(HttpStatusCode.OK, response1.StatusCode, $"Fetching {Uri1}");
AssertX.Equal(HttpStatusCode.OK, response2.StatusCode, $"Fetching {Uri2}");
错误日志提供了实际的,预期的信息,并在提示我之前指出了哪个webapi是罪魁祸首。
我意识到我来不及回答,但认为这可能会帮助其他人寻找实用的解决方案,而这些解决方案没有时间安装/学习另一个测试框架,只是为了从测试失败中获取有用的信息。
答案 2 :(得分:1)
使用 try/catch 就足以满足我的目的:
try
{
Assert.Equal(expectedErrorCount, result.Count);
}
catch (EqualException ex)
{
throw new XunitException($"{testMsg}\n{ex}");
}