我正在使用Rhino Mocks来设置严格的模拟。在某些条件下,不能对任何这些模拟执行任何方法调用。
<form method="GET">
<input type="text" name="brand">
<input type="text" name="model">
<input type="text" name="condition">
<input type="text" name="transmission">
<input type="submit" value="SEARCH">
</form>
<?php
// Function to check if the $var value is empty or not.
function not_empty($var)
{
return !empty($var) && !is_null($var) && isset($var);
}
// Step 1
if(!empty($_GET) && isset($_GET)){
// Step 2, apply not_empty function with array_filter for each GET parameter, to get the non-empty list.
$parameters = array_filter($_GET, 'not_empty');
if(!empty($parameters) && isset($parameters)){
// Step 3, Generate the pagination URLs
$pagination_query = '';
$i = 0;
foreach ($parameters as $key => $value) {
if($i == 0){
$pagination_query .= "$key=$value";
}else{
$pagination_query .= "&$key=$value";
}
$i++;
}
echo "example.com/car-listings.php?".$pagination_query."&page=2";
}
}
现在,DoSomething将所有内容包装在try-catch中:
// Arrange
var myMock = MockRepository.GenerateStrictMock<IMyClass>();
var sut = new SUT(myMock);
// Act
sut.DoSomething();
这会导致捕获strict mock的expectationexception。我的测试通过,但不应该。
我希望调用public void DoSomething()
{
try {
m_Class.Something();
}
catch {
}
}
会导致测试失败,但情况也不是这样。
如何实现这一结果?
答案 0 :(得分:1)
拥有一个吃掉异常的catch块通常是一种不好的做法。但是,如果您无法更改,则可以使用.AssertWasCalled()
和.AssertWasNotCalled()
对成员使用更明确的断言,如下所示:
myMock.AssertWasNotCalled(x => x.Something())
但如果你想验证没有被调用的东西,那就需要为每个可能的接口成员设置一个断言,这将是乏味的,并且容易被未来的成员遗漏。
不幸的是,使用Exceptions进行断言是RhinoMocks(以及大多数单元测试框架,如NUnit,Moq,NSubstitute等)的基本原理,因此在传播到测试框架之前捕获这些异常通常会成为一个问题。