- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一些对象被放入队列中。队列中的所有对象都实现相同的基接口(interface),这也要求它们实现 IEquatable<>。
我想验证是否以正确的顺序将正确的对象放入队列中。
当我编写一个断言 CollectionAssert.AreEqual(expected,actual)
的测试时,测试失败,说明虽然队列是预期长度,但它在索引 0 处不同。
但是,当我将测试断言写为 Assert.IsTrue(expected.SequenceEqual(actual))
时,测试通过了。
在我看来,这两个断言应该是相同的,但显然它们是完全不同的。
NUnit 的网站对集合断言方法的介绍不是很详细,而 Linq 文档虽然更详细,但如果无法与 NUnit 使用集合断言方法进行比较,也无济于事。
这两个断言有何不同?
编辑 - 添加细节
这是被测代码以及我希望得到相同结果的两个测试。
public enum ArgumentTypeEnum
{
SpiceworksDbName,
DestinationDbName,
DestinationServerName
}
public interface IArgument : IEquatable<IArgument>
{
}
public interface ICommandArgument : IArgument
{
ArgumentTypeEnum ArgumentType { get; }
}
internal interface IValueArgument : IArgument
{
String ArgumentValue { get; }
}
public class CommandArgument : ICommandArgument
{
public CommandArgument(ArgumentTypeEnum argumentType) {
ArgumentType = argumentType;
}
public ArgumentTypeEnum ArgumentType { get; private set; }
public bool Equals(IArgument other)
{
if (other == null)
{
return false;
}
var otherAsCommandArg = other as CommandArgument;
if (otherAsCommandArg == null)
{
return false;
}
return ArgumentType == otherAsCommandArg.ArgumentType;
}
}
public class ValueArgument : IValueArgument
{
public ValueArgument(String argumentValue)
{
ArgumentValue = argumentValue;
}
public string ArgumentValue { get; private set; }
public bool Equals(IArgument other)
{
if (other == null)
{
return false;
}
var otherAsValueArg = other as ValueArgument;
if (otherAsValueArg == null)
{
return false;
}
return ArgumentValue == otherAsValueArg.ArgumentValue;
}
}
public class Tokenizer
{
public Queue<IArgument> TokenizeArguments(string[] args) {
var tokenQueue = new Queue<IArgument>();
args.ToList().ForEach((arg) => {
if (arg.StartsWith("-"))
{
switch (arg)
{
case "-sd":
tokenQueue.Enqueue(new CommandArgument(ArgumentTypeEnum.SpiceworksDbName));
break;
case "-dd":
tokenQueue.Enqueue(new CommandArgument(ArgumentTypeEnum.DestinationDbName));
break;
case "-ds":
tokenQueue.Enqueue(new CommandArgument(ArgumentTypeEnum.DestinationServerName));
break;
default:
tokenQueue.Enqueue(new ValueArgument(arg));
break;
}
}
else
{
tokenQueue.Enqueue(new ValueArgument(arg));
}
});
return tokenQueue;
}
}
[TestFixture]
public class TokenizerSpecs
{
///Passes
[Test]
public void Tokenizer_MultipleCommandsAndValues_TokenizesAsExpected1() {
var args = new[]
{
"-sd", @"\\some\Directory\foo.db", "-dd", "some database name", "-ds", "Server.name", "somerandomarg",
"-unreconized"
};
var t = new Tokenizer();
var actualResult = t.TokenizeArguments(args);
var expectedResult = new Queue<IArgument>();
expectedResult.Enqueue(new CommandArgument(ArgumentTypeEnum.SpiceworksDbName));
expectedResult.Enqueue(new ValueArgument(@"\\some\Directory\foo.db"));
expectedResult.Enqueue(new CommandArgument(ArgumentTypeEnum.DestinationDbName));
expectedResult.Enqueue(new ValueArgument("some database name"));
expectedResult.Enqueue(new CommandArgument(ArgumentTypeEnum.DestinationServerName));
expectedResult.Enqueue(new ValueArgument("Server.name"));
expectedResult.Enqueue(new ValueArgument("somerandomarg"));
expectedResult.Enqueue(new ValueArgument("-unreconized"));
Assert.IsTrue(expectedResult.SequenceEqual(actualResult));
}
///Fails
[Test]
public void Tokenizer_MultipleCommandsAndValues_TokenizesAsExpected2()
{
var args = new[]
{
"-sd", @"\\some\Directory\foo.db", "-dd", "some database name", "-ds", "Server.name", "somerandomarg",
"-unreconized"
};
var t = new Tokenizer();
var actualResult = t.TokenizeArguments(args);
var expectedResult = new Queue<IArgument>();
expectedResult.Enqueue(new CommandArgument(ArgumentTypeEnum.SpiceworksDbName));
expectedResult.Enqueue(new ValueArgument(@"\\some\Directory\foo.db"));
expectedResult.Enqueue(new CommandArgument(ArgumentTypeEnum.DestinationDbName));
expectedResult.Enqueue(new ValueArgument("some database name"));
expectedResult.Enqueue(new CommandArgument(ArgumentTypeEnum.DestinationServerName));
expectedResult.Enqueue(new ValueArgument("Server.name"));
expectedResult.Enqueue(new ValueArgument("somerandomarg"));
expectedResult.Enqueue(new ValueArgument("-unreconized"));
CollectionAssert.AreEqual(expectedResult, actualResult);
}
}
最佳答案
我已经查看了 NUnit 的源代码,看来您这里有一个错误。比较由 NUnitEqualityComparer.EnumerablesEqual
完成,随后通过 NUnitEqualityComparer.ObjectsEqual
比较每个元素。我们可以使用这个对象做简单的测试:
var n = new NUnitEqualityComparer();
var tolerance = Tolerance.Zero;
var equal = n.AreEqual(new CommandArgument(ArgumentTypeEnum.SpiceworksDbName),
new CommandArgument(ArgumentTypeEnum.SpiceworksDbName),
ref tolerance);
这个测试返回false
!
不知何故,ObjectsEqual
并没有在对象的 Equals
方法中结束。需要对源代码进行调试才能找出原因,但这个测试足以证明存在错误。
关于c# - NUnit CollectionAssert.AreEqual(expected,actual) vs Assert.IsTrue(expected.SequenceEqual(actual)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26390953/
def istrue(a): if a: return True return False 这样的功能能以某种方式占有一席之地吗?我的意思是,如果我想检查一个变量的真实
这个问题可能是an earlier unanswered one的副本。我仍然有问题。 我正在尝试使用邮政编码shapefile并出现以下错误: tract <- readOGR(dsn = ".",
我想添加一条消息以显示在 Visual Studio 2010 测试结果中。 如果测试失败,我可以发布一条消息,但事实并非如此。有没有办法做到这一点? 例如: dim quoteNumber as s
目标: 当您按下自定义的 link 时你进入一个网页,屏幕位于一个特定的位置,你有文本 “Padding - Shorthand Property”。 目标是使用 Assert.IsTrue 使 pa
长话短说 如何创建一个表达式,其中 Expression.NodeType == ExpresionType.IsTrue || ExpresionType.IsFalse 背景信息 我正在创建 En
Assert.IsTrue(false) 不应该抛出异常吗? 最佳答案 Assert.Pass 抛出 SuccessException http://www.nunit.org/index.php?p
previous post促使我发布这个问题。重新分配 == 似乎是最佳实践至 isTRUE(all.equal()) (和 != 到 !isTRUE(all.equal()) 。我想知道其他人是否在
Spring Data查询创建是否支持查询创建中的IsTrue/False? 我找到了这个部分 http://docs.spring.io/spring-data/jpa/docs/1.0.0.M1/
“IsFalse”和“IsTrue”基本上只是隐式转换为 bool 值吗?我知道它们被短路运算符(AndAlso,OrElse)使用,但它们在功能或内部工作方面是否与隐式转换为 boolean 有任何
本文整理了Java中org.mozilla.zest.core.v1.ZestConditional.isTrue()方法的一些代码示例,展示了ZestConditional.isTrue()的具体用
我想检查数据框两列中的值是否不匹配,并使用此信息创建一个新列。我想使用 dplyr::mutate,并且我希望能够处理 NA 值。可以使用此代码生成一个简单的示例: library(dplyr) le
测试返回类型为 bool 的方法时。 你应该: expected = true; Assert.AreEqual(expected, actual); 或 Assert.IsTrue(actual);
我在一项测试中做出断言,我想测试发送的消息数 >=1 我有两种等效的方法来做到这一点。 1: Assert.IsTrue(messagesSent >= 1); 2:
测试isTRUE(all.equal(x, y))有什么区别吗?和 identical(x, y) ? 帮助页面说: Don't use 'all.equal' directly in 'if' ex
这两者有什么区别吗? 最佳答案 没有区别。自 v2.5 起添加了 Assert.True() 和其他内容(不含 Is)。 来自版本 2.5 的文档:( nunit v2.5 ) Two forms a
在 C# 中: Assert.IsTrue(NewPagePost.IsInEditMode(), ""wasn't in edit mode"); Assert.AreEqual("Samp
我正在尝试使用我下载的空间数据 here为了在ggplot2中制作 map 。 library(rgdal) library(ggplot2) library(rgeos) df <- readOGR
什么时候应该使用 Apache Commons 的 Validate.isTrue,什么时候应该只使用 'assert' 关键字? 最佳答案 Validate.isTrue 和 'assert' 的用
我一直在考虑为 Controller Controller 实现单元测试,特别是围绕测试集合。关于MSDN example使用CollectionAssert.Contains()确认对象是否出现在列
我无缘无故地 F3 进入这个,并且惊讶地看到这个方法实现如下: public static boolean isTrue(Boolean bool) { if (bool == nul
我是一名优秀的程序员,十分优秀!