2016-11-10 4 views
0

Я довольно новичок в Nsubstitute и модульном тестировании. Я знаю, что в модульном тестировании вам не нужны никакие другие зависимости. Поэтому для того, чтобы это правило применялось, мы издеваемся над единицами.Nsubstitute: Издевательский объект Параметр для модульного тестирования

У меня есть этот пример для тестирования кода, где метод имеет параметр объекта:

class dependency { 
    public int A; 
    public dependency() { 
    // algorithms going on ... 
    A = algorithm_output; 
    } 
} 

class toTest { 
    public int Xa; 
    public void Foo(dependency dep_input){ 
    Xa = dep_input.A; 
    // Xa will be used in an algorithm ... 
    } 
} 

Я думал насмешливый конструктор, но я не мог понять, как в Nsubstitute. Так, в конечном счете, как бы я это испытал?

+0

Вы можете только обманывать интерфейсы и виртуальные методы с помощью NSubstitute. Конструкторы - это не-go, а также не виртуальные или статические методы. Возможно, вам следует добавить интерфейс к вашему классу? –

+0

Скорее всего, интерфейс - это то, что вы хотите использовать в любом случае, если вы хотите проверить это. Если у вас все еще есть зависимость от фактического класса, вы, вероятно, все еще будете запускать код в этом классе, который может повлиять на ваши тесты, и вам, возможно, придется наброситься на определенное поведение в этом классе, чтобы оно соответствовало вашему тесту , –

+0

Что делать, если я не могу изменить проверяемый код (по какой-то причине в проекте, над которым я работаю)? @ LasseV.Karlsen –

ответ

4

Я не могу добавить комментарий, потому что это слишком долго, так что я добавить ответ: если вы хотите проверить Foo вам не нужно дразнить CTOR но dep_input. Например, если вы используете Moq. Но вы также можете использовать заглушку

public interface IDependency 
{ 
    int A { get; } 
} 

public class Dependency : IDependency 
{ 
    public int A { get; private set; } 

    public Dependency() 
    { 
     // algorithms going on ... 
     A = algorithm_output(); 
    } 

    private static int algorithm_output() 
    { 
     return 42; 
    } 
} 

public class ToTest 
{ 
    public int Xa; 

    public void Foo(IDependency dep_input) 
    { 
     Xa = dep_input.A; 
     // Xa will be used in an algorithm ... 
    } 
} 

[TestFixture] 
public class TestClass 
{ 
    [Test] 
    public void TestWithMoq() 
    { 
     var dependecyMock = new Mock<IDependency>(); 
     dependecyMock.Setup(d => d.A).Returns(23); 

     var toTest = new ToTest(); 
     toTest.Foo(dependecyMock.Object); 

     Assert.AreEqual(23, toTest.Xa); 
     dependecyMock.Verify(d => d.A, Times.Once); 
    } 

    [Test] 
    public void TestWithStub() 
    { 
     var dependecyStub = new DependencyTest(); 

     var toTest = new ToTest(); 
     toTest.Foo(dependecyStub); 

     Assert.AreEqual(23, toTest.Xa); 
    } 

    internal class DependencyTest : IDependency 
    { 
     public int A 
     { 
      get 
      { 
       return 23; 
      } 
     } 
    } 
} 
+0

Ах! Это очень полезный пример. Благодаря! @Dominik –

 Смежные вопросы

  • Нет связанных вопросов^_^