在使用越来越多的JavaScript代码处理更大的Web应用程序时,我们就如何提高代码质量进行了头脑风暴会议.
最初的想法之一是引入单元测试.这将是一个长期目标; 但是,这不会解决最常见的回归原因:更改DOM和浏览器特定问题.
单元测试在模拟的无DOM环境中运行,不在页面上.
我正在寻找的是一个断言框架,可以插入代码中,如下所示:
var $div = $("div.fooBarClass");
assertNotEmpty($div);
$div.fooBarAction();
Run Code Online (Sandbox Code Playgroud)
我发现断言框架可以做到这一点,但它们都可以登录控制台或进入DOM或打开一个愚蠢的弹出窗口.这些都不与(数千个)自动化测试一起工作. 我正在寻找的是一个运行时断言框架,它通过AJAX记录失败的断言!理想情况下,它应该是:
我已经成功地使用目标C中的标准NSAssert(condition_which_should_evaluate_true,@"错误消息")语句,并在断点导航器中添加"所有异常"断点,以编程方式指定条件时,使我的调试版本停止执行.
好又好,但是大多数时候我在调试时,我还希望在那之后继续正常的程序执行.在断言失败后继续执行该程序有助于追踪混淆/错误的来源.至少就我记得在不同平台上编程时的情况而言.
在Objective C开发中是否有标准的方法可以做到这一点?
我在我的应用中收到此错误:
***断言失败-[UICollectionView _endItemAnimations],/ SourceCache/UIKit/UIKit-2372/UICollectionView.m:2801
它出现在我的-controllerDidChangeContent:方法中:
[self.collectionView performBatchUpdates:^{...}];
Run Code Online (Sandbox Code Playgroud)
有谁知道是什么原因造成的?我的代码基于https://gist.github.com/4440c1cba83318e276bb,我很茫然.
谢谢!
在Chai,您可以执行以下操作:
expect({}).to.exist;
Run Code Online (Sandbox Code Playgroud)
exist不是函数调用,但这仍然适用于测试框架.反向(expect({}).to.not.exist)导致测试失败,但同样,exist不是函数调用.
这些断言如何在不让我调用函数的情况下工作?事实上,如果我试图说expect({}).to.exist()测试失败,因为exist它不是一个函数.
http://hackage.haskell.org/package/base-4.6.0.1/docs/src/GHC-Base.html#assert似乎定义assert为无操作.在启用断言时,将其转换为其他内容的逻辑在哪里?
我正在尝试为以下条件设置流畅的断言.但是找不到带有表达式的方法或带有Or()的ObjectAssertion.
我得检查我的服务状态是枚举值Pending还是Active
services.Should().HaveCount(totalServices).And.BeOfType<Service>().Which.ServiceStatusKey.Should().Be(Status.Pending);
Run Code Online (Sandbox Code Playgroud)
我想要的东西,
.Be(Status.Pending).Or().Be(Status.Active)
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我实现这一目标.
FluentAsserstions版本:4.1.1(Nuget的最新内容)附加4.1 FluentAssertions.Primitive命名空间.
// Decompiled with JetBrains decompiler
// Type: FluentAssertions.Primitives.ObjectAssertions
// Assembly: FluentAssertions.Core, Version=4.1.1.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a
// MVID: 090116C5-E9A5-4878-B62E-DE0EBFEBBE14
// Assembly location: C:\RA\P4V\BOSS\trunk\M5Portal\packages\FluentAssertions.4.1.1\lib\net45\FluentAssertions.Core.dll
using FluentAssertions;
using FluentAssertions.Common;
using FluentAssertions.Execution;
using System;
using System.Diagnostics;
namespace FluentAssertions.Primitives
{
/// <summary>
/// Contains a number of methods to assert that an <see cref="T:System.Object"/> is in the expected state.
///
/// </summary>
[DebuggerNonUserCode]
public class ObjectAssertions : ReferenceTypeAssertions<object, ObjectAssertions>
{
/// <summary>
/// Returns the …Run Code Online (Sandbox Code Playgroud) 我理解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*函数来创建前置条件/后置条件语句,或者在性能或其他方面有一些问题吗?
在发布版本下,我无法找到关于Q_ASSERT语义的明确声明.如果没有断言检查,那么断言的表达式是否被评估?
请考虑以下代码
Q_ASSERT(do_something_report_false_if_failed());
Run Code Online (Sandbox Code Playgroud)
将do_something_report_false_if_failed()在所有潜在的Qt构建配置下运行?相反,它会更安全(即使更冗长,更不易读):
bool is_ok = do_something_report_false_if_failed();
Q_ASSERT(is_ok)
Run Code Online (Sandbox Code Playgroud)
后一种方法的缺点是ASSERT故障不那么冗长,但是可能更清楚地表明该语句是执行的?
在Jasmine,有toBeGreaterThan和toBeLessThan匹配.
如果我想检查特定范围内的整数值怎么办?toBeInBetween匹配器有什么吗?
目前,我可以通过两个单独的expect调用解决它:
var x = 3;
expect(x).toBeGreaterThan(1);
expect(x).toBeLessThan(10);
Run Code Online (Sandbox Code Playgroud) assertions ×10
javascript ×3
testing ×2
unit-testing ×2
assert ×1
breakpoints ×1
c# ×1
c++ ×1
chai ×1
clojure ×1
continuation ×1
fluent ×1
function ×1
ghc ×1
haskell ×1
ios ×1
ios6 ×1
ipad ×1
jasmine ×1
objective-c ×1
qt ×1
r ×1