我怎样才能做一个模拟方法返回不同的答案吗?

6视图(30天)
我试图使用模拟框架来测试一个类方法计算的方差图像帧流运行。方法的输入通常来自另一个数据类。我想做的是一个模拟,它返回一个正态分布随机框架每次调用这个函数,然后有一个测试,检查,经过大量的帧,返回的方差是1(在公差)。
如果我把我的方法是这样的:
函数模拟= makeMock2 (obj)
(模拟,b) = createMock (obj,“AddedMethods”,{“r”});
进口matlab.mock.actions.AssignOutputs;
rng (1)
x = @ () randn (obj。行,obj.cols);
当(withAnyInputs (b.r),重复(32岁AssignOutputs (x ())));
结束
当输出分配, randn 评估和输出是静态的,因此我所有的输入都是相同的。第二件事我试着一次性添加多个帧列表:
函数模拟= makeMock3 (obj)
(模拟,b) = createMock (obj,“AddedMethods”,{“r”});
进口matlab.mock.actions.AssignOutputs;
rng (1)
x = num2cell (randn (obj。行,obj。关口,32),[1 - 2]);
当(withAnyInputs (b.r) AssignOutputs (x {:}));
结束
这仍然给第一帧的唯一原因 AssignOutputs 交易输出变量的值,所以我总是只要求第一个。
最后一个丑陋的事情我是:
当(withAnyInputs (b.r),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
然后(AssignOutputs (randn (obj。行,obj.cols)),
AssignOutputs (randn (obj。行,obj.cols)))
)))))))))))))))))))))))))))))));
这给了我一个错误,说我是嵌套太深。
我会注意,我想测试的方法想要整个模拟对象作为输入,不只是框架,因此只需传递一个随机框架是不可能的。这是很大的一部分,更大的代码库,所以简单地重写方法在测试框架直接重构当前没有明显不可能很多人,所以我坚持做测试这种方式。
有一种优雅的方式去做我想要做什么?

接受的答案

大卫·赫鲁斯卡对此
大卫·赫鲁斯卡对此 2017年9月18日
不幸的是,没有一个清洁的方法。我会记录这个问题在一个增强请求,但是,考虑将来的版本。
建立在最后解决方法你试过:动作可以建立在一个循环中。这避免了大部分的重复和产生的深层嵌套。这里有一个例子:
进口matlab.mock.actions.AssignOutputs;
(模拟,b) = createMock (obj,“AddedMethods”,{“r”});
rng (1)
n = 32;
action = AssignOutputs (randn (obj。行,obj.cols));
我= 1:n - 1
action = action.then (AssignOutputs (randn (obj。行,obj.cols)));
结束
当(withAnyInputs (b.r)、行动);
然后,当您使用模拟(我指定行简洁=关口= 1):
i = 1: n
disp (mock.r);
结束
它根据需要返回的随机数序列:
-0.6490
1.1812
-0.7585
-1.1096
-0.8456
-0.5727
-0.5587
0.1784
-0.1969
0.5864
-0.8519
0.8003
-1.5094
0.8759
-0.2428
0.1668
-1.9654
-1.2701
1.1752
2.0292
-0.2752
0.6037
1.7813
1.7737
-1.8651
-1.0511
-0.4174
1.4022
-1.3677
-0.2925
1.2708
0.0660
你只需要选择“n”足够大当设置模拟进一步调用方法将返回最后一个值。
1评论
伊恩克雷格
伊恩克雷格 2017年9月18日
谢谢,那是完美的!我的测试已经有一个属性,定义了模拟的帧的数量交付,所以我就用这个代替 n 在你的答案。

登录置评。

更多的答案(0)

类别

找到更多的在模拟框架帮助中心文件交换

s manbetx 845

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!