我使用异常抛出函数对 php 中的类中的参数进行了一些检查。我有一些函数可以进行基本检查(===等in_array)并在 false 时抛出异常。所以我可以assertNumeric($argument, "\\$argument is not numeric.");代替
if ( ! is_numeric($argument) ) {\n throw new Exception("\\$argument is not numeric.");\n}\nRun Code Online (Sandbox Code Playgroud)\n\n节省一些打字时间
\n\n\n\n\n\n\n正如维基百科所述 - “断言主要是一种开发工具,当程序向公众发布时,它们通常会被禁用。” \n“断言应该用于记录\n逻辑上不可能的情况,并\n发现编程错误\xe2\x80\x94如果\n\'不可能\'发生,那么\n根本上的事情显然是错误的。这是\n\n与错误处理不同:大多数\n 错误情况都是可能的,\n 尽管有些在实践中极不可能\n 发生。使用\n 断言作为通用错误\n 处理机制通常是不明智的:\n 断言不允许从错误中正常恢复,并且断言失败通常会突然停止程序的执行。断言也不会显示用户友好的错误消息。”
\n\n这意味着“gk at proliberty dot com”给出的强制启用断言的建议,即使已手动禁用断言,也违背了仅将它们用作开发的最佳实践工具
\n
那么,我是不是“做错了”?还有哪些其他/更好的方法可以做到这一点?
\n我有这个(不是真的,只是一个简单的例子):
template<class T>
T foo() {...}
Run Code Online (Sandbox Code Playgroud)
我需要检查函数的结果类型(这里没有任何意义,我的例子更复杂,我保证),google test/mock是否支持这种断言?
我用A <T>尝试EXPECT_THAT,但我无法做到这一点.
谢谢.
我目前正在开发一个跨平台的C++ SDK,我必须将断言处理程序移植到WinRT.该过程的一部分是显示消息框,等待用户输入并在用户选择"调试"时触发断点.
我已经有一个消息框出现,但我找不到等待消息框出现的方法而不离开当前执行点.
到目前为止,这是我的代码.
// Create the message dialog factory
Microsoft::WRL::ComPtr<ABI::Windows::UI::Popups::IMessageDialogFactory> messageDialogFactory;
Microsoft::WRL::Wrappers::HStringReference messageDialogFactoryId(RuntimeClass_Windows_UI_Popups_MessageDialog);
Windows::Foundation::GetActivationFactory(messageDialogFactoryId.Get(), messageDialogFactory.GetAddressOf() );
// Setup the used strings
Microsoft::WRL::Wrappers::HString message;
Microsoft::WRL::Wrappers::HString title;
Microsoft::WRL::Wrappers::HString labelDebug;
Microsoft::WRL::Wrappers::HString labelIgnore;
Microsoft::WRL::Wrappers::HString labelExit;
message.Set( L"Test" );
title.Set( L"Assertion triggered" );
labelDebug.Set(L"Debug");
labelIgnore.Set(L"Ignore");
labelExit.Set(L"Exit");
// Create the dialog object
Microsoft::WRL::ComPtr<ABI::Windows::UI::Popups::IMessageDialog> messageDialog;
Microsoft::WRL::ComPtr<ABI::Windows::Foundation::Collections::IVector<ABI::Windows::UI::Popups::IUICommand*>> messageDialogCommands;
messageDialogFactory->CreateWithTitle( message.Get(), title.Get(), messageDialog.GetAddressOf() );
messageDialog->get_Commands(messageDialogCommands.GetAddressOf());
// Attach commands
Microsoft::WRL::ComPtr<ABI::Windows::UI::Popups::IUICommandFactory> commandFactory;
Microsoft::WRL::Wrappers::HStringReference commandFactoryId(RuntimeClass_Windows_UI_Popups_UICommand);
Windows::Foundation::GetActivationFactory(commandFactoryId.Get(), commandFactory.GetAddressOf() );
CInvokeHandler commandListener;
commandFactory->CreateWithHandler(labelDebug.Get(), &commandListener, commandListener.m_DebugCmd.GetAddressOf() );
commandFactory->CreateWithHandler(labelIgnore.Get(), &commandListener, commandListener.m_IgnoreCmd.GetAddressOf() );
commandFactory->CreateWithHandler(labelExit.Get(), …Run Code Online (Sandbox Code Playgroud) 有谁知道如何阻止 xUnit.NetXunit.SDK.TraceAssertException在被测代码触发失败时抛出 a System.Diagnostics.Debug.Assert?
我经常在 DEBUG 模式下使用守卫来提醒其他开发人员他们正在错误地使用 API。但是,随着 xUnit.Net 抛出此异常,它破坏了我的单元测试。
我想从非final类的实例方法中检查该类的构造函数和初始值设定项及其特定实例的子类链是否已经完成.
在下面的示例中,我有一个类Abstract,可用于实现允许添加侦听器的接口(为简单起见,这只是Runnable实例),并提供signalEvent()调用所有附加侦听器的方法.
abstract class Abstract {
protected final void signalEvent() {
// Check that constructs have run and call listeners.
}
public final void addListener(Runnable runnable) {
...
}
}
class Concrete extends Abstract {
Concrete() {
// Should not call signalEvent() here.
}
void somethingHappened() {
// May call signalEvent() here.
}
}
Run Code Online (Sandbox Code Playgroud)
现在可以signalEvent()从子类构造函数中调用,但是那时候没有办法添加一个监听器,事件就会丢失.在我们的代码库中,偶尔会有人添加这样的调用,我希望能够尽早捕获这些调用(使用assert语句或类似的语句).
是否可以直接或间接地从当前实例的子类构造函数或初始化程序中检查实例方法,或者,是否可以检查实例的所有构造函数是否都已完成?
如何替换断言错误消息?如果我调用$this->assertTrue(false, 'message'),它将显示字符串“message”以及另一条消息,说明 false 不是 true。如何让它只输出我选择的消息?这可能吗?
我喜欢 NUnit 基于约束的 API。我经常使用这样的浮点比较:
double d = foo.SomeComputedProperty;
Assert.That(d, Is.EqualTo(42.0).Within(0.001));
Run Code Online (Sandbox Code Playgroud)
很有可读性!
但是,如果我有一个自定义类,其相等性取决于浮点比较:
class Coord
{
Coord(double radius, double radians)
{
this.Radius = radius;
this.Radians = radians;
}
double Radius { get; }
double Radians { get; }
public override bool Equals(Object obj)
{
Coord c = obj as Coord;
if (obj == null || c == null) return false;
return c.Radians == this.Radians && c.Radius == this.Radius;
}
}
Run Code Online (Sandbox Code Playgroud)
我想像这样编写我的测试:
Coord reference = new Coord(1.0, 3.14);
// test another Coord …Run Code Online (Sandbox Code Playgroud) 我有一个正在开发的 Pixel-C。我的最低 API 级别是 21,这也是 ART 取代 Dalvik 的级别。我已经尝试过以下两种方法:
adb shell setprop dalvik.vm.enableassertions all
adb shell setprop debug.assert 1
Run Code Online (Sandbox Code Playgroud)
他们似乎执行成功。我已经放置
assert false : "assertions are active!";
Run Code Online (Sandbox Code Playgroud)
在我的 onStart 中,我在 logcat 中没有看到任何堆栈跟踪。我希望应用程序在我安装并运行后立即退出。请告诉我如何让这个断言执行。
请不要提及 JUnit 或其他进行断言的方法,也不要提及任何需要显式抛出错误的解决方案。生产代码永远不应该抛出错误,也不应该尝试捕捉和处理它们。这就是为什么将断言添加到语言中的原因,以便在测试环境中违反不变量时导致应用程序崩溃,而不会在生产中产生任何开销或风险。
这个 6 年前的问题基本相同,但对于 Dalvik(IE 过时),解决方案要么不起作用,要么不好: 我可以在 Android 设备上使用断言吗?
我使用 Visual Studio 创建一个自动化测试,该测试创建两个 Excel 工作表。作为最后的检查,我需要比较这两个excel表的内容并确保它们相等。有没有办法用断言来做到这一点?
像Assert.AreEqual(file1, file2);什么?
任何帮助或指导将不胜感激!
我的目标是确保对象图具有预期的值和类型。我想确保每个值都是预期的类型。
为此,assertEquals()不幸的是没有用:
$this->assertEquals(
[ 'prop' => '0' ],
[ 'prop' => 0 ]
);
// -> no failures
Run Code Online (Sandbox Code Playgroud)
在这种情况下,assertSame()效果很好:
$this->assertSame(
[ 'prop' => '0' ],
[ 'prop' => 0 ]
);
// Failed asserting that Array &0 (
// 'prop' => 0
// ) is identical to Array &0 (
// 'prop' => '0'
// ).
Run Code Online (Sandbox Code Playgroud)
问题assertSame()在于它还检查对象的引用:
$this->assertSame(
(object) [ 'prop' => 0 ],
(object) [ 'prop' => 0 ]
);
// Failed asserting …Run Code Online (Sandbox Code Playgroud) assertions ×10
c# ×3
c++ ×2
java ×2
phpunit ×2
android ×1
debugging ×1
excel ×1
googlemock ×1
googletest ×1
messagebox ×1
nunit ×1
oop ×1
output ×1
php ×1
testing ×1
unit-testing ×1
xunit.net ×1