2015-02-06 1 views
0

Допустим, у меня есть интерфейс со следующими членамиГлумление методы испытаний, которые находятся в том же интерфейсе и называется в

public interface IDataService 
{ 
    Employee TestMethodA(); 
    Employee TestMethodB(); 
} 

public class DataService : IDataService 
{ 
    public Employee TestMethodA() 
    { 
     return new Employee() {Id = 10, Name = "Montu Pradhan"}; 
    } 

    public Employee TestMethodB() 
    { 
     var emp = TestMethodA(); 
     return emp; 
    } 
} 

public class Employee 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

Тогда мне нужно проверить метод MethodB насмехаясь над Methoda. У меня есть следующее приспособление, но элемент управления все еще входит в MethodA. Я использую JustMock для платформы тестирования.

[TestClass] 
public class UnitTest1 
{ 
    [TestMethod] 
    public void TestInterfaceMock() 
    { 
     var pensionMock = Mock.Create<DataService>(); 
     Mock.Arrange<Employee>(() => pensionMock.TestMethodA()) 
     .Returns(new Employee() {Id = 101,Name = "Mock Employee"}); 
     var result = pensionMock.TestMethodB(); 
     Assert.AreEqual(result.Name, "Mock Employee"); 
     Assert.AreEqual(result.Id, "Mock Employee"); 
    } 
} 

ответ

0

Я могу издеваться над MethodA, если его Virtual. Затем отладчик будет возвращать объект, который имеет в Reuturns() блока в Mock.Arrange ....

0

Вы не можете издеваться TestMethodA(), так как это в том же классе, что вы проверяете - вы можете сделать TestMethodA() виртуальные, создавать производный класс, который переопределяет TestMethodA() (высмеивает его) и тест TestMethodB(), который не изменяется в вашем тестер-классе.

public class DataService : IDataService 
{ 
    public virtual Employee TestMethodA() 
    { 
     return new Employee() {Id = 10, Name = "Montu Pradhan"}; 
    } 

} 

public class TestableDataService : DataService 
{ 
    private Employee e; 
    public TestableDataService(Employee returningEmployee) 
    { 
     this.e = returningEmployee; 
    } 

    public override Employee TestMethodA() 
    { 
     return e; 
    } 
} 

Теперь вы можете проверить TestMethodB():

[TestClass] 
public class UnitTest1 
{ 
    [TestMethod] 
    public void TestInterfaceMock() 
    { 
     var testableSut = new TestableDataService(new Employee() {Id = 101,Name = "Mock Employee"}); 
     var result = testableSut.TestMethodB(); 
     Assert.AreEqual(result.Name, "Mock Employee"); 
     Assert.AreEqual(result.Id, "101"); 
    } 
} 

Другим вариантом было бы Разделить IDataService в два интерфейса containig TestMethodA и TestMethodB (зависит от конструкции decistions например сцепления), а затем вводят интерфейс, содержащий TestMethodA в класс - тогда вы можете издеваться над этим, как вы этого хотели.

0

Thanks Mr.Wombat.

В реальном приложении действует как один и тот же сценарий. Мне нужно было настроить много вещей для MethodA и использовать его. я смог издеваться над ним, если он был виртуальным.

Большинство структур Mock не издеваются над не виртуальными методами. Возможные варианты: коммерческая лицензия JustMock, которая может выполнять не виртуальный метод.