2015-07-02 4 views
1

У меня есть класс фабрики возвращающегося делегата, как показано ниже (метод GetDelegate)Как проверить делегат, используя Moq и NUnit

public interface IFactory 
{ 
    Func<int, string> GetDelegate(bool isValid); 
} 

public class AFactory : IFactory 
{ 
    private readonly IService1 _service1; 
    private readonly IService2 _service2; 

    public AFactory(IService1 service1, IService2 service2) 
    { 
     _service1 = service1; 
     _service2= service2; 
    } 

    public Func<int, string> GetDelegate(bool isValid) 
    { 
     if (isValid) 
      return _service1.A; 
     return _service2.B; 
    } 
} 

public interface IService1 
{ 
    string A(int id); 
} 

public interface IService2 
{ 
    string B(int id); 
} 

Я пытаюсь написать модульный тест для GetDelegate, но не знаю, как утверждать, что конкретный Func был возвращен в зависимости от IsValid

Моя попытка испытания блока как ниже (который я не доволен)

[Test] 
    public void ShouldReturnCorrectMethod() 
    { 
     private var _sut = new AFactory(new Mock<IService1>(), new Mock<IService2>()); 

     var delegateObj = _sut.GetDelegate(true); 
     Assert.AreEqual(typeof(string), delegateObj.Method.ReturnType); 
     Assert.AreEqual(1, delegateObj.Method.GetParameters().Count()); 
    } 

Любая помощь очень ценится

благодаря

ответ

2

Один из способов будет издеваться результат вызова IService1.A и IService2.B, точно так же, как если бы вы называли их непосредственно. Затем вы можете проверить, что при вызове возвращаемого делегата вы получите ожидаемый ответ (и что вызов был сделан в соответствующую службу).

+0

Thanks. Да, это должно помочь. Из любопытства это «правильное» использование фабричного шаблона? Я действительно не возвращаю экземпляр класса как таковой? –

+0

@nesh_s: Ну, вы возвращаете значение ... это не должен быть просто класс. Это немного необычно, но не особенно тревожно. –

1
[Test] 
public void GetDelegate_WhenCalledWithIsValidTrue_ReturnsDelegateA() 
{ 
    // Arrange 
    Mock<IService1> service1Mock = new Mock<IService1>(); 
    Mock<IService2> service2Mock = new Mock<IService2>(); 

    string expectedResultA = "A"; 
    string expectedResultB = "B"; 

    service1Mock.Setup(s => s.A(It.IsAny<int>())).Returns(expectedResultA); 
    service2Mock.Setup(s => s.B(It.IsAny<int>())).Returns(expectedResultB); 

    var _sut = new AFactory(service1Mock.Object, service2Mock.Object); 

    // Act 
    Func<int, string> delegateObj = _sut.GetDelegate(true); 

    // Assert 
    string result = delegateObj(0); 
    Assert.AreEqual<string>(expectedResultA, result); 
} 
Смежные вопросы