我希望能够写jasmine http://pivotal.github.io/jasmine/类似于 Matlab 中的测试。
所以像
expect(myfibonacci(0)).toBe(0);
expect(myfibonacci(5)).toBe(15);
expect(myfibonacci(10)).toBe(55);
我尝试采用两种策略来实现这一点:
(1)第一个策略使用结构体
expect = @(actual_value) struct('toBe', @(expected_value) assert(actual_value == expected_value));
(真正的实现不会只是调用assert)
但这不起作用:
expect(1).toBe(1); % this triggers a syntax error
??? Improper index matrix reference.
% this will work:
x = expect(1);
x.toBe(1);
(2)我尝试的第二个策略是使用一个类:
classdef expect
properties (Hidden)
actual_value
end
methods
function obj = expect(actual_value)
obj.actual_value = actual_value;
end
function obj = toBe(obj, expected_value)
assert(obj.actual_value == expected_value);
end
end
end
乍一看这看起来不错:
可以在控制台运行
expect(1).toBe(1);
但是,不是在控制台中而是在脚本中运行它给出
??? Static method or constructor invocations cannot be indexed.
Do not follow the call to the static method or constructor with
any additional indexing or dot references.
Error in ==> test at 1
expect(1).toBe(1);
有什么方法可以让这个想法在 matlab 中发挥作用吗?
在最新版本的 MATLAB (13a/13b) 中,内置了一个单元测试框架,它看起来与您正在尝试的非常相似。代替
expect(myfibonacci(0)).toBe(0);
你会写
import matlab.unittest.constraints.IsEqualTo
testCase.verifyThat(myfibonacci(0), IsEqualTo(0))
(你也可以/代替assumeThat
, assertThat
, or fatalAssertThat
).
如果出于某种原因您希望实现自己的框架,请注意语法中的细微差别 - 您有一个点,而 MathWorks 之间有一个逗号myfibonacci(0)
和测试条件。
在 MATLAB 中,您无法对这样的下标表达式的结果进行索引(好吧,您could,但你必须超载subsref
,那是一个痛苦的世界,相信我)。因此,他们的做法是将测试比较条件作为单独的包引入,并将它们作为单独的输入参数应用,而不是作为点语法的方法。
看一眼文档 http://www.mathworks.com/help/matlab/matlab-unit-test-framework.html对于新的单元测试框架,可以了解有关框架本身的更多信息,或者(如果您更愿意使用自己的)他们设计的语法以与您的语法进行比较。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)