2015-02-06 68 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; } 
} 

然後我需要通過嘲笑治法來測試方法方法b的接口。我有以下固定裝置,但控制仍然進入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如果它的虛擬。然後,調試器將返回Mock.Arrange中Reuturns()塊中的對象....

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 TestMethodATestMethodB(取決於設計decistions如凝聚力),然後注入含有TestMethodA進入界面該班 - 那麼你可以嘲笑它,因爲你想要它。

0

謝謝Mr.Wombat。

在真實的應用程序中充當相同的場景。我必須爲MethodA設置很多東西並使用它。如果它是虛擬的,我可以嘲笑它。

大多數Mock框架不會嘲笑非虛擬方法。這些選項是可以模擬非虛擬方法的JustMock商業許可證。