在Java中,我偶尔会AssertionError直接抛出一个,断言不会到达某个特定的行.这样做的一个示例default是switch声明无法访问语句中的大小写(有关示例,请参阅此JavaSpecialists页面).
我想在.Net中使用类似的机制.我可以使用相同的例外吗?或者是否有另一种方法可以使用相同的效果?
编辑 - 为了澄清,我正在寻找一种在运行时标记失败的机制,在已发布的代码中,表明代码中某些不变量(可能是灾难性的)失败.链接的示例生成0到2(包括0和2)之间的随机整数,并声明生成的数字始终为0,1或2.如果此断言不成立,则最好完全停止执行而不是继续使用某些未知数腐败的系统状态.
我理解Clojure的*assert*变量可以用来关闭断言,但我做的事似乎没有用.
(defn foo [a]
{:pre [(pos? a)]}
(assert (even? a))
[a])
(binding [*assert* false]
(foo 1))
!! exception
(binding [*assert* false]
(foo -2))
!! exception
Run Code Online (Sandbox Code Playgroud)
甚至false在定义时绑定也有同样的问题:
(binding [*assert* false]
(defn bar [a]
{:pre [(pos? a)]}
(assert (even? a))
[a]))
(bar 1)
!! execption
Run Code Online (Sandbox Code Playgroud)
然后甚至直接设置变量也不起作用.
*assert*
is true
(alter-var-root (var *assert*) not)
*assert*
is still true
Run Code Online (Sandbox Code Playgroud)
和
(var-set (var *assert*) false)
*assert*
is still true
Run Code Online (Sandbox Code Playgroud)
所以现在我不明白该怎么做.我很迷惑.
谢谢.
是否建议使用RUnit的check*函数来创建前置条件/后置条件语句,或者在性能或其他方面有一些问题吗?
在scala中,当我使用确保 predef时,它只适用于if-else表达式的else部分:
def evenIt(x:Int) = {
if(x % 2 == 0)
x+1 //return odd on purpose!
else{
x + 1
} ensuring( _ % 2 == 0)
}
//Test it:
evenIt(3)
> 4
evenIt(4)
> 5 //<--- ensuring does not catch this!
Run Code Online (Sandbox Code Playgroud)
但我认为"if-else"是scala中的表达.所以它应该只返回一个值 - 反过来应该传递给确保?
或者我在这里混淆了什么?谢谢.
编辑:在Scala编程中,作者使用如下:
private def widen(x: Int) : Element =
if(w <= width)
this
else {
val left = elem(' ', (w - width) / 2, height)
var right = elem(' …Run Code Online (Sandbox Code Playgroud) 看起来这个功能应该在即将推出的Swift 2.0/XCode 7版本中得到支持,这显然将包括try/catch优点,所以这个问题可能没有实际意义.当他们没有测试版时,我会尝试相应地更新这篇文章.
在Swift中,虽然我假设问题/答案适用于Objective-C,但我想编写一个foo格式函数:
public class SomeClass{
public func foo(someString:String){
//validate someString
assert(!someString.isEmpty, "The someString parameter cannot be empty.")
}
}
Run Code Online (Sandbox Code Playgroud)
我使用了一个assert电话,因为我相信这是Apple推荐的,而不是抛出异常,这在其他语言中很常见.
但是,在我的单元测试中,我希望能够确保当someString参数为空字符串时函数确实失败:
class SomeClass_Tests:XCTestCase{
func test_foo_someStringParamaterIsEmpty_error(){
//ACTION
let someClassInstance = SomeClass()
someClassInstance.foo("")
//VALIDATE
//**What goes here?
}
}
Run Code Online (Sandbox Code Playgroud)
我找不到关于这种情况的文档或帖子,尽管我认为这是一个非常重要的单元测试,以确保类和库的正确行为和使用.
在包含异常/异常处理的其他语言中,assert将替换为类似的东西throw SomeError()然后,在单元测试中,您可以简单地将操作包装在try/ catchblock中并声明异常确实已设置,如下所示:
class SomeClass_Tests:XCTestCase{
func test_foo_someStringParamaterIsEmpty_error(){
//ACTION
let someClassInstance = SomeClass()
var expectedException:SomeException? = nil
try{
someClassInstance.foo("")
}catch(someException:SomeException){
expectedException = someException
} …Run Code Online (Sandbox Code Playgroud) 将断言放入代码中有什么意义?自信编程有什么好处?
private void WriteMessage(string message)
{
Debug.Assert(message != null, "message is null");
File.WriteAllText(FILE_PATH, message);
}
Run Code Online (Sandbox Code Playgroud)
例如,我们可以检查消息变量并在此处抛出异常.为什么我在这里使用assert?或者这是一个错误的例子,看到断言的好处?
我收到此错误消息:
调试断言失败!
表达:_BLOCK_TYPE_US_VALID(pHead-> nBlockUse)
同时尝试做以下事情
#include <vector>
#include <algorithm>
using namespace std;
class NN
{
public:
NN(const int numLayers,const int *lSz,const int AFT,const int OAF,const double initWtMag,const int UEW,const double *extInitWt);
double sse;
bool operator < (const NN &net) const {return sse < net.sse;}
};
class Pop
{
int popSize;
double a;
public:
Pop(const int numLayers,const int *lSz,const int AFT,const int OAF,const double initWtMag,const int numNets,const double alpha);
~Pop();
vector<NN> nets;
void GA(...);
};
Pop::Pop(const int numLayers,const int *lSz,const int …Run Code Online (Sandbox Code Playgroud) 我想知道是否有很多人用java编程断言.我认为这对于没有足够书面合同或过时合同的大型项目非常有用.特别是当你使用webservices,组件......
但我从未见过任何使用断言的项目(除了junit/testng测试......).
我注意到抛出的类是一个错误而不是异常.有人能告诉我他们为什么选择错误吗?可能是因为异常可能被意外捕获而不是记录器/重新抛出?
如果您使用组件开发应用程序,我想知道您在哪里放置断言: - 在组件方面,就在通过公共API返回数据之前? - 在组件客户端?如果在任何地方调用api,你会设置一个称为断言机制的外观模式?(然后我猜你把你的断言和外观放在一些外部项目上,你的客户端项目将依赖于这个断言项目?)
我理解如何使用断言,并在使用它们时,只是想知道是否有人根据真实的断言经验提出建议.
谢谢
根据我的理解,constexpr函数可以在编译时和运行时执行,具体取决于整个评估是否可以在编译时完成.
但是,您不能重载此函数以使运行时和编译时对应.
所以我的问题是,如何在运行时断言中确保运行时函数的执行与我的static_assert一起传递有效参数?
我正在尝试使用一个简单的代码org.testng.Assert来断言2个用例.在第一个用例中,我Fail正确地声明了2个不相等的值.
但是在第二个用例中,当我在try-catch块中断言2个不相等的值时,结果总是返回为 Pass
我的代码如下:
package demo;
import org.testng.Assert;
import org.testng.annotations.Test;
public class Q43710035
{
@Test
public void test1()
{
System.out.println("Within test1");
int a = 12;
int b =20;
Assert.assertEquals(a, b);
}
@Test
public void test2()
{
System.out.println("Within test2");
int a = 12;
int b =20;
try
{
Assert.assertEquals(a, b);
}catch(Throwable t)
{
System.out.println("Exception Occurred");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的结果是:
Within test1
Within test2
Exception Occurred
PASSED: test2
FAILED: test1
java.lang.AssertionError: expected [20] but found [12]
at org.testng.Assert.fail(Assert.java:94) …Run Code Online (Sandbox Code Playgroud)