对protected方法进行Mock
现在有一个类,其中有一个protected方法:
1. public class MockSomeClass : SomeClass 2. { 3. protected override int SomeMethod(string arg) 4. { 5. return this.PublicSomeMethod(arg); 6. } 7. 8. public virtual int PublicSomeMethod(string arg) 9. { 10. return base.SomeMethod(arg); 11. } 12. } |
1. Mock<MockSomeClass> mockSomeClass = new Mock<MockSomeClass>() { CallBase = true }; 2. mockSomeClass.Setup(c => c.PublicSomeMethod("123")).Returns(123); 3. 4. DoSomeTest(mockSomeClass.Object); // use the mock object |
也很容易。
为了可测试性
值得注意的是,为了“可测试性”,第二部分中的protected方法必须是virtual的,因为我们需要在子类中进行override。同理,Mock框架能够辅助的方法也必须是virtual的,即使是一个public方法。那么,您觉得这是为了可测试性而做出的让步吗?或者换句话说,您觉得,一个不可以override的protected方法,但是会影响到其他公开接口的功能,这是不是一个合理的设计呢?如果这是一个合理的设计,又不想作出这样的让步……我们又该怎么做呢?(以上言论仅代表作者的个人观点,不代表51Testing观点)