Trying to unit test the internet is not a good idea, your life will be easier if you refactor things and simplify a little.
public bool StringIsEvenLength(string somestring )
public string FetchRemoteString( string uri )
public bool RemoteStringIsEvenLength(string uri)
{
fetched = FetchRemoteString( uri );
if( fetched != null ) {
return StringIsEvenLength( fetched );
}
throw new SomeOtherException("Didn't get a string to check the length of.");
}
Now StringIsEvenLength is trivial to test.
When you want to test RemoteStringIsEvenLength
You can mock out FetchRemoteString and don't even have to use a WebClient at all.
That's a pretty good point, and a much better solution to the example I gave. It'd be interesting to see FetchRemoteString as a Func<string, string> property where you could have a default implementation (web client) and then in your test setup you could just redefine the property to do whatever you want.
The general point still stands though - if there was an interface, we wouldn't have to come up with these workarounds.
Comments
Trying to unit test the internet is not a good idea, your life will be easier if you refactor things and simplify a little.
Now StringIsEvenLength is trivial to test. When you want to test RemoteStringIsEvenLengthYou can mock out FetchRemoteString and don't even have to use a WebClient at all.
That's a pretty good point, and a much better solution to the example I gave. It'd be interesting to see FetchRemoteString as a Func<string, string> property where you could have a default implementation (web client) and then in your test setup you could just redefine the property to do whatever you want.
The general point still stands though - if there was an interface, we wouldn't have to come up with these workarounds.