2016-10-18 5 views
2

У меня есть интерфейсКак MOq методы, которые возвращают «это»

interface IService 
{ 
    IService Configure(); 
    bool Run(); 
} 

«Реальная» реализация делает это:

class RealService : IService 
{ 
    public IService Configure() 
    { 
     return this; 
    } 

    public bool Run() 
    { 
     return true; 
    } 
} 

Используя Moq издеваться службами создает реализацию по умолчанию Configure() это возвращается null.

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

ответ

3

Предполагая, что вы используете Moq, вы можете просто Setup макет, чтобы вернуть себе:

var mock = new Mock<IService>(); 

mock.Setup(service => service.Configure()).Returns(mock.Object); 

var testClass = new TestClass(mock.Object); 

Затем подтвердите, вернет ли метод то, что вы ожидаете:

Assert.AreEqual(mock.Object, testClass.DoStuff()); 
+0

Вы говорите, что "Moq от Microsoft". Вы имеете в виду [этот 'Moq'] (https://github.com/Moq/moq4#who)? –

+0

@ JeppeStigNielsen действительно, я должен был быть более точным – meJustAndrew

2

Вы можете просто создать еще один фиктивный объект, который использует тот же интерфейс и вернуть его:

[TestClass] 
public class UnitTest1 
{ 

    [TestMethod] 
    public void TestMethod1() 
    { 
     var serviceMock1 = new Mock<IService>(); 
     var serviceMock2 = new Mock<IService>(); 

     serviceMock1.Setup(service => service.Configure()) 
      .Returns(serviceMock2.Object); 

     var testClass = new TestClass(serviceMock1.Object); 

     Assert.IsNotNull(testClass.DoStuff()); 
    } 
} 

public class TestClass 
{ 
    private readonly IService _service; 

    public TestClass(IService service) 
    { 
     _service = service; 
    } 

    public IService DoStuff() 
    { 
     return _service.Configure(); 
    } 
} 


public interface IService 
{ 
    IService Configure(); 
    bool Run(); 
} 

public class RealService : IService 
{ 
    public IService Configure() 
    { 
     return this; 
    } 

    public bool Run() 
    { 
     return true; 
    } 
} 
2

В любом случае будет работать, чтобы настроить методы, которые возвращают насмешливый экземпляр.

//Arrange 
var instance = Mock.Of<IService>();//mocked instance 
var mockService = Mock.Get(instance);//mock object used to setup instance functionality 
//setup method to return mocked instance 
mockService.Setup(m => m.Configure()).Returns(instance); 

Или

//Arrange 
var mockService = new Mock<IService>();//mock object used to setup instance functionality 
var instance = mockService.Object;//mocked instance 
//setup method to return mocked instance 
mockService.Setup(m => m.Configure()).Returns(instance); 
Смежные вопросы