问题标签 [assertions]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
2672 浏览

smalltalk - Smalltalk 和断言

尝试一些 smalltalk + TDD + “良好实践” 我遇到了一个丑陋的块:

如何在 GNU Smalltalk 中进行断言?

我只是在寻找一种简单ifFalse: [Die]的东西

0 投票
2 回答
1982 浏览

c++ - VS2008 中的断言,但 VS2005 中没有

从 VS2005 切换到 VS2008 SP1 后,我发现了一个我无法解释的问题。
一个程序在 VS2005 下在发布和调试模式下都能正常工作。在 VS2008 下,当进入调试器时,会引发一个断言。
如果我让程序运行(在调试或发布模式下),则根本没有断言。

我花了将近两天的时间,我不明白我做错了什么。

程序描述: 我有一个基于 MFC 对话框的程序,它创建一个用户线程 (CWinThread),该线程创建应用程序的主对话框。
工作线程无限循环并每秒向对话框发布一条消息。消息在 gui 线程中处理。

我的代码的某些部分:

gui线程的InitInstance:

工作线程:

对话消息处理程序是这样的:

这与 VS2005 完美配合。但是使用VS2008,但只要下一个断点并进入调试模式,我就会提出一个断言???
wincore.cpp 第 906 行

如果我删除 GUI 线程并将对话框创建到 CWinApp 线程中,则问题不再发生。

有人知道吗?
难道我做错了什么?

谢谢

0 投票
1 回答
5041 浏览

c# - Assert.ReferenceEquals() 在 Visual Studio 测试中传递 Object.ReferenceEquals() 返回“false”的位置

在尝试在 Visual Studio Professonal 2008 的测试功能中创建初始失败的单元测试时,当对象实例等于空引用时,我似乎Assert.ReferenceEquals()无法正确失败。请注意,对于相同的比较,它正确返回。object.ReferenceEquals()false

这是我的课程代码:

然后这里是我的测试课的关键方面:

请注意,该static void Startup(object)方法是空的,因此该static object TheObject属性永远不会设置并保持不变null。所以,显然,Assert.ReferenceEquals(obj, Project.TheObject)应该失败,但不知何故,这个测试通过了。

注意改变

Assert.ReferenceEquals(obj, Project.TheObject)

Assert.IsTrue(object.ReferenceEquals(obj, Project.TheObject))

导致此测试正确失败。

这似乎太简单了,但我看不出这里出了什么问题。如果有人能以我的方式指出错误,我将不胜感激。

提前致谢,

麦克风

詹姆斯艾弗里回答的更新:

啊,我现在感觉多么愚蠢。我知道它必须是这样的。哇。

果然,“GoToDefinition”将我带到“Object.ReferenceEquals()”。所以键入“Assert.ReferenceEquals()”实际上是 System.Object.ReferenceEquals(),在我的例子中它悄悄地返回“false”。当然,这与实际失败的断言无关,因此测试通过。惊人的。

谢谢詹姆斯。

0 投票
9 回答
1376 浏览

assertions - Belt and Braces 是编程的好习惯还是只是引入了不必要的复杂性?

我想知道使用腰带和大括号(吊带)方法进行编程 - 尤其是数据验证 - 是否是一种好习惯。这来自以下示例。

我正在创建一个表单,并向所有字段添加了侦听器,这意味着OK只有在表单中的所有字段都具有有效值时才启用该按钮。然后我正在编写OK单击按钮时运行的代码。

我悲观的一面认为,Belt and Braces 永远不会伤害任何人,如果我的表单逻辑出现错误,再次验证表单也无妨。

但是,如果验证失败,我不知道要输入什么。如果我做这样的事情:

然后我必须创建代码来显示不应该显示的错误消息。将来维护此代码的任何人都会担心并且可能会对此在理论上不必要的对话感到困惑。我想要的最后一件事是有人想知道为什么这个特定的对话框从不显示。

规模的另一端的一个选项是:

坦率地说,即使打字我也觉得很脏,但也许有一个很好的理由使用它,但我错过了。

所以最后我结束了:

然而,它的缺点是它不是真正的腰带和大括号,因为大括号在运行时不存在,所以如果代码中有错误,我的表单的裤子仍然会掉下来。

所以也许我根本不应该有额外的验证,但我仍然有一部分认为它不会受到伤害。

我很想听听你在类似情况下会做什么。

编辑:问题是问什么是确保表单返回有效数据的最佳方法。假设表单的输出在它最终进入数据库之前再次验证等等。)

0 投票
16 回答
21796 浏览

c++ - 在发布版本中使用 assert() 时避免未使用的变量警告

有时,局部变量仅用于在 assert() 中检查它,就像这样 -

在 Release 构建中编译代码时,assert()s 通常被禁用,因此此代码可能会产生关于 Result 已设置但从未读取的警告。

一个可能的解决方法是 -

但是它需要太多的输入,看起来并不容易,并且会导致总是检查条件(是的,编译器可能会优化检查,但仍然如此)。

我正在寻找一种替代方式来表达这个assert(),这种方式不会引起警告,但仍然易于使用并避免改变assert() 的语义。

(在此代码区域中使用#pragma 禁用警告不是一种选择,降低警告级别以使其消失也不是一种选择......)。

0 投票
7 回答
2607 浏览

debugging - 断言式编程的好处

将断言放入我们的代码有什么意义?断言式编程有什么好处?

例如,我们可以检查消息变量并在此处抛出异常。为什么我在这里使用断言?或者这是一个看到断言好处的错误例子?

0 投票
10 回答
45899 浏览

c - C编译器断言-如何实现?

在错误情况下,我想实现一个“断言”来防止编译,而不是在运行时失败。

我目前有一个这样定义的,效果很好,但会增加二进制文件的大小。

示例代码(无法编译)。

我该如何实现它以使其不生成任何代码(以最小化生成的二进制文件的大小)?

0 投票
4 回答
988 浏览

assertions - 在 4GL 中实现断言

使用 Progress 4GL 或 WebSpeed实现断言的最佳方式是什么?

0 投票
4 回答
4982 浏览

c++ - 为什么我的矢量代码断言?到底什么是断言?

究竟什么是“断言”,或者更具体地说,我如何摆脱错误。当我创建一个指向具有数据成员 int x 的类的指针向量时,然后执行以下操作:

并运行程序,直到 x 大于 maxx 并且我使用 .erase() 之前我没有收到任何错误,此时我收到此错误:

调试断言失败!

程序:...My Documents\O.exe 文件:...include\vector 行:116

表达式:("this->_Has_container()",0)

有关您的程序如何导致断言失败的信息,请参阅有关断言的 Visual C++ 文档。

(按重试调试应用程序)

[中止][重试][忽略]

另外,如果我尝试使用 cout:

我收到此错误:

调试断言失败!

程序:...My Documents\O.exe 文件:...include\vector 行:98

表达式:向量迭代器不可延迟

有关您的程序如何导致断言失败的信息,请参阅有关断言的 Visual C++ 文档。

(按重试调试应用程序)

[中止][重试][忽略]

有人可以告诉我为什么我不能使用向量中的任何数据,以及如何解决它?

还:antiviral_data 是一个指针向量,只有一个元素:

如果这有帮助。

0 投票
3 回答
1976 浏览

javascript - 让 javascript 强制 Selenium 测试失败

有没有办法让 js 代码强制 Selenium 测试失败?对于(可能是坏的)示例,如果我有以下内容:

有没有一种方法可以使“runScript”命令失败,具体取决于 js 代码是返回真还是假?(我知道其他 Selenium 命令可以使用该示例,但我想要一个更通用的解决方案。)

我是否需要学习如何扩展 Selenium 以添加另一个命令?

我对 Selenium 也比较陌生,所以使用 Selenium-rc 可以解决这个问题吗?