7

我认为当方法没有结果时总是返回空列表或数组而不是 null 是一种很好的做法,以避免代码中的 null 检查。

因为 Rhino Mocks 返回一个对象的默认值,对于列表和数组为 null,很多时候我必须重新添加 null 检查或设置模拟以返回列表。

有没有办法用这种行为配置或扩展 Rhino Mocks?

var repositoryMock = MockRepository.GenerateMock<ICustomerRepository>();
IList<Customer> customers = repositoryMock.getCustomers();

Assert.IsNotNull(customers);
Assert.AreEqual(0, customers.Count );
4

3 回答 3

1

事实证明,只要返回的对象是 IEnumerable , Moq就可以实现这种行为。以下测试通过:

[Test]
public void EmptylListTest()
{
    var repositoryMock = new Mock<ICustomerRepository>();

    IEnumerable<Customer> customers = repositoryMock.Object.GetCustomers();

    Assert.IsNotNull(customers);
    Assert.AreEqual(0, customers.Count());
}

[Test]
public void EmptyArrayTest()
{
    var repositoryMock = new Mock<ICustomerRepository>();

    Customer[] customerArray = repositoryMock.Object.GetCustomerArray();

    Assert.IsNotNull(customerArray);
    Assert.AreEqual(0, customerArray.Length);
}

public interface ICustomerRepository
{
    IEnumerable<Customer> GetCustomers();
    Customer[] GetCustomerArray();
}
于 2009-02-15T09:34:43.163 回答
0

Rhino Mocks 中没有任何东西可以自动解决您的问题。最简单的解决方案是为使用 SetupResult(或 repeat.any)配置默认值的每种类型简单地设置一个扩展/实用方法。

您可能总是很棘手并通过成员进行枚举,检查 ILists / Arrays 并动态设置模拟 - 这取决于您拥有多少类型以及您可以专用于该实用程序方法的类型。

祝你好运!

于 2009-02-12T08:02:57.087 回答
-1

我认为更改模拟的默认行为以返回非默认值将是一个冒险的举动。

如果您的 ICustomerRepository 的实际实现中有一个错误,以至于它没有返回一个空列表而是返回一个 null,会发生什么?

如果您编写其他单元测试并针对自动返回空列表的 ICustomerRepository 的模拟版本进行测试,那么您会认为一切正常。您甚至可能构建该代码并认为它​​会正常工作,因此您运行编译的应用程序并开始崩溃。

为什么?因为您命中 ICustomerRepository 的类没有正确处理空值。

我宁愿明确并在测试中设置期望从 getCustomers() 方法返回一个空的 IList,而不是在模拟中发生一些“魔术”。为什么?因为它提高了可读性,并且代码的工作方式符合其他可能不熟悉 rhino 的开发人员所期望的工作方式。即没有期望的方法返回默认值。

于 2009-02-12T22:39:07.573 回答