public class ClassUnderTest { private int DoSomePrivateStuff() { // Something is happening here } }Since the method is private you can not access the it from the outside of the object.
How I solved this earlier was to make a testable class that inherited from the class I wanted to test.
public class TestableClassUnderTest : ClassUnderTest { public int DoSomePrivateStuff() { base.DoSomePrivateStuff(); } }
I now could do the following.
[TestClass] public class ClassUnderTestTests { [TestMethod] public void DoSomePrivateStuff_WhenCalled_ReturnsZero() { //Arrange var testClass = new TestableClassUnderTest(); //Act var actual = testClass.DoSomePrivateStuff(); //Assert Assert.AreEqual(0, actual); } }
This is the classic Extract and Override pattern and there is nothing wrong with it.
But as a colleague showed me today, there is another way when you are using Visual Studio.
- Goto the ClassUnderTest in visual studio and right click. Select "Create Private Accessor" and select the test project you want this accessor in.
- Go to the test project you choose in step 1. You will now have a project folder called "Test References" with one file ending with ".accessor".
[TestClass] public class ClassUnderTestTests { [TestMethod] public void DoSomePrivateStuff_WhenCalled_ReturnsZero() { //Arrange var testClass = new ClassUnderTest_accessor(); //Act var actual = testClass.DoSomePrivateStuff(); //Assert Assert.AreEqual(0, actual); } }What's nice about this is that you don't need to create a bunch of testable classes. They are automagically created with reflection for you. Now you got more time to do fun stuff.... :-)
You can read more about this here: http://msdn.microsoft.com/en-us/library/bb385974.aspx
0 kommentarer:
Post a Comment