模拟c#设置中的错误返回函数的值

时间:2014-01-20 11:45:45

标签: c# tdd rhino-mocks

interface ITaxi
{
    int Fare { get; set; }
    int getTotalFare();        
}


class Taxi : Car, ITaxi
{

    public Taxi(Engine e) : base (e){ }        

    public int Fare { get; set; }
    public int getTotalFare()
    {
        return 0;
    }
}


[TestFixture]
class TestTaxi
{
    [Test]
    public void TestTaxiFare()
    {
        MockRepository mockRepo = new MockRepository();
        ITaxi taxi = mockRepo.Stub<ITaxi>();
        using (mockRepo.Record())
        {
            SetupResult.For(taxi.getTotalFare()).Return(400);
        }
        Assert.AreEqual(400, taxi.getTotalFare());
    }
}

我是测试驱动开发的新手。我试图模拟一个类并为该方法设置一个值。 但我

message castle.dynamicProxy.generators.generatorexception Type is not public, so a proxy cannot be generated. type: UnitTest.ITaxi
  1. 我在代码中遗漏了什么吗?

  2. 存根和模拟有什么区别? [我读链接不明白]?

3 个答案:

答案 0 :(得分:2)

您必须声明Rhino Mocks的接口public才能创建模拟:

public interface ITaxi
{
    int Fare { get; set; }
    int getTotalFare();        
}

另见Access Modifiers in C#

答案 1 :(得分:0)

将班级更改为公开

public class Taxi : Car, ITaxi

interface ITaxi

默认情况下不是公开的

答案 2 :(得分:0)

正如其他人所提到的,您需要将接口声明为Public。

模拟和存根之间的区别非常微妙(根据我对Roy Osherove的Art of Unit Testing书的理解)。

  • 存根可以帮助测试但是永远不会失败测试,​​因为实际的测试是针对被测试的类进行的。
  • 当针对该对象执行断言时,模拟可能会使测试失败。

为了进一步解释,存根是一个预制响应(一个虚假对象),它有助于以后执行断言(即它可以是您正在测试的方法的参数)。您永远不会断言存根通过或未通过测试,因为它是您已配置为帮助测试其他内容的对象

另一方面的模拟设定了期望值,例如,如果我使用参数集配置此对象,我期望发生什么?它会改变它的内部状态(如我所料)还是会抛出异常(我期望)。这是您要测试的断言。

在更复杂的测试中,你可以拥有许多存根,但你应该只有一个模拟。