2016-01-19 3 views
1

У меня есть класс, который выглядит примерно так:NSubstitute - притворяется виртуальный метод, который вызывает еще один виртуальный метод

public class MyClass 
{ 
    public virtual bool A() 
    { 
     return 5 < B(); 
    } 

    protected virtual int B() 
    { 
     return new Random.Next(1, 10); 
    } 
} 

При написании тестов для MyClass было бы удобно, чтобы быть в состоянии сделать следующее:

[Fact] 
public void Blabla() 
{ 
    var o = Substitute.ForPartsOf<MyClass>(); 
    o.A().Returns(true); 

    Assert.True(o.DoSomethingElse()); 
} 

Однако это не работает. Я получаю исключение во время выполнения:

NSubstitute.Exceptions.CouldNotSetReturnDueToTypeMismatchException

не может возвратить значение типа Boolean для MyClass.A (предполагаемый тип INT).

Есть ли способ обойти это, или мне нужно создать конкретный тестовый двойной класс, переопределяющий A?

ответ

2

Я решил ее модификации тест-код следующим образом:

var o = Substitute.ForPartsOf<MyClass>(); 
o.When(x => x.A()).DoNotCallBase(); 
o.A().Returns(true); 

Assert.True(o.DoSomethingElse()); 

Это предотвращает подделку от вызова фактической реализации в следующем Returns() вызова.