2013-04-02 2 views
1

У меня есть реализация фабрики образца небольшого образца ниже, и было интересно, если кто-то может помочь мне написать правильный MOq случаи модульного тестирования, для максимального охвата кода:Testing Factory Pattern

public class TestClass 
{ 
    private readonly IService service; 

    public TestClass(Iservice service) 
    { 
     this.service = service; 
    } 

    public void Method(string test) 
    { 
     service = TestMethod(test); 
     service.somemethod(); 
    } 

    private IService TestMethod(string test) 
    { 
     if(test == 'A') 
      service = new A(); 
     if(test == 'B') 
      service = new B(); 
     return service; 
    } 
} 

Ищу некоторую помощь в тестирование TestClass и что еще более важно, когда я TestMethod отправить Mock, например, мой метод испытаний опускается ниже:

[TestMethod] 
public void TestCaseA() 
{ 
    Mock<IService> serviceMock = new Mock<Iservice>(MockBehaviour.strict); 
    TestClass tClass = new TestClass(serviceMock.Object); 

    // The Question is, what is best approach to test this scenario ? 
    // If i go with below approach, new A() will override serviceMock 
    // which i am passing through constructor. 
    var target = tClass.Method("A"); 
} 

ответ

5

вы не дразнить TestClass, потому что это то, что вы тестируете.

Для этого вам необходимо сделать свойство только для чтения для service.

public IService Service { get; private set; } 

Вам необходимо проверить путь, что и конструктор и Method изменять состояние (в данном случае Service) экземпляра TestClass.

Ваш тест будет выглядеть следующим для тестирования Method для B теста:

[TestMethod] 
public void TestSomeMethod() 
{ 
    // Arrange/Act 
    var target = new TestClass((new Mock<IService>()).Object); 
    target.Method("B"); 

    // Assert 
    Assert.IsInstanceOfType(target.Service, typeof(B)); 
} 

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

[TestMethod()] 
public void TestCasesA() 
{ 
    // Arrange/Act 
    var target = new TestClass("A"); 

    // Assert 
    Assert.IsInstanceOfType(target.service, typeof(A)); 
} 

Я бы рекомендовал только использовать подход конструктора, чтобы ввести ваш IService. Это позволяет вам иметь неизменный объект, который уменьшит состояние вашего приложения.

+0

Я думаю, я не был ясно из моего вопроса. Предположим, у меня есть конструктор, где я отправляю Iservice (который я могу использовать для Mock (Iservice), когда я тестирую). Мой главный вопрос - горячий, я могу проверить метод (string), который инициализирует конструктор? Служба Mock, которую я отправляю, будет написана TestMethod. – Aravind

+0

@ user2237300 Я не уверен, к чему вы клоните. Можете ли вы обновить свой вопрос, чтобы сделать его более понятным? –

+0

Я обновил свой вопрос, дайте мне знать, если его ясно? – Aravind