我的Rhino mocks Strict Mock期望异常正在执行方法中被捕获。怎么解决?

时间:2017-01-05 08:43:20

标签: rhino-mocks

我正在使用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 { } } 会导致测试失败,但情况也不是这样。

如何实现这一结果?

1 个答案:

答案 0 :(得分:1)

拥有一个吃掉异常的catch块通常是一种不好的做法。但是,如果您无法更改,则可以使用.AssertWasCalled().AssertWasNotCalled()对成员使用更明确的断言,如下所示:

myMock.AssertWasNotCalled(x => x.Something())

但如果你想验证没有被调用的东西,那就需要为每个可能的接口成员设置一个断言,这将是乏味的,并且容易被未来的成员遗漏。

不幸的是,使用Exceptions进行断言是RhinoMocks(以及大多数单元测试框架,如NUnit,Moq,NSubstitute等)的基本原理,因此在传播到测试框架之前捕获这些异常通常会成为一个问题。