Unit testing HTTP requests
I really rather think you have the right idea with the interface and your real class. I do heartily endorse your use of readonly which doesn't get a lot of exposure. However, there are many good mocking frameworks out there that you don't need to write your own fake class to unit test with. For instance, we use Moq where I work and your unit test example would look like this:

Mock&lt;IWebRequest&gt; fakeRequest = new Mock&lt;IWebRequest&gt;();

fakeRequest
    .Setup(request =&gt; request.DownloadString(It.IsAny&lt;string&gt;())
    .Returns("fake response string");

TestClass test = new TestClass(fakeRequest.Object);
string fakeResponse = await test.DoStuff();