2016-12-27 5 views
0

У меня есть следующий код в модульном тестеMock класса в классе в модульном тесте

using Moq; 
using OtherClass; 
[TestClass] 
public class TestClass 
{ 
    [TestMethod] 
    public void TestMethod() 
    { 
     OtherClass other = new OtherClass(); 
     OtherClass.foo(); 
    } 
} 

Вот другой класс

using ThirdClass; 
public class OtherClass 
{ 
    public void foo() 
    { 
     ThirdClass third = new ThirdClass(); 
     third.bar(); 
    } 
} 

ThirdClass еще находится в стадии разработки, но я хочу чтобы иметь возможность запускать мои модульные тесты с использованием moq. Есть ли способ сказать moq, чтобы высмеивать ThirdClass внутри TestClass, не используя/не зависящий от Metcl/В идеале что-то вроде:

public void TestMethod() 
{ 
    OtherClass other = new OtherClass(); 
    Mock<ThirdClass> third = new Mock<ThirdClass>(); 
    third.setup(o => o.bar()).Returns(/*mock implementation*/); 
    /*use third in all instances of ThirdClass in OtherClass*/ 
    OtherClass.foo(); 
} 
+0

Похоже 'OtherClass' должен быть * * при условии, экземпляр' ThirdClass' вместо * создающего * один. – David

ответ

2

Метод foo() в классе OtherClass не единица проверяемым, потому что создание нового экземпляра реальной службы, и вы не можете дразнить его.

Если вы хотите издеваться над этим, вам нужно ввести ThirdClass с инъекцией зависимости.

Пример OtherClass будет:

public class OtherClass 
{ 
    private readonly ThirdClass _thirdClass; 
    public OtherClass(ThirdClass thirdClass) 
    { 
     _thirdClass = thirdClass; 
    } 
    public void foo() 
    { 
     _thirdClass.bar(); 
    } 
} 

Ваш метод испытания с примером тестирования другого класса может быть:

public void TestMethod() 
{ 
    // Arrange 
    Mock<ThirdClass> third = new Mock<ThirdClass>(); 
    third.setup(o => o.bar()).Returns(/*mock implementation*/); 

    OtherClass testObject= new OtherClass(third); 

    // Action 
    testObject.foo(); 

    // Assert 
    ///TODO: Add some assertion. 
} 

Вы можете использовать пример попробовать с Unity DI контейнер.

0

Спасибо за идеи, ребята. Я закончил создание другой версии OtherClass.foo(), которая принимает экземпляр ThirdClass, а в версии без него создается экземпляр. При тестировании я могу вызвать foo (mockThird), но пользователи могут просто использовать foo().

using ThirdClass; 
public class OtherClass 
{ 
    public void foo(ThirdClass third) 
    { 
     third.bar(); 
    } 
    public void foo() 
    { 
     foo(new ThirdClass()); 
    } 
} 

В тестовом классе

public void TestMethod() 
{ 
    Mock<ThirdClass> third = new Mock<ThirdClass>(); 
    third.setup(o => o.bar()).Returns(/*mock implementation*/); 
    OtherClass testObject= new OtherClass(); 

    testObject.foo(third); 
} 
+0

Я просто хочу сообщить вам, что согласно правилам этого портала вы не можете оставлять дополнительные вопросы в качестве ответов. Вы должны отредактировать исходный вопрос, если это необходимо, или добавить в качестве комментариев. Если вы редактируете вопрос, пожалуйста, убедитесь, что вы оставите согласованность с ответом. благодаря – kat1330

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