2014-09-23 101 views
4

我使用Moq來模擬HttpWebRequest。我能夠嘲笑頭&方法,但當我試圖嘲笑接受時,它爆炸。嘲笑HttpWebRequest接受Moq

代碼是:

Mock<HttpWebResponse> response = new Mock<HttpWebResponse>(MockBehavior.Loose); 
Mock<HttpWebRequest> request = new Mock<HttpWebRequest>(); 
request.Setup(s => s.GetResponse()).Returns(response.Object); 
request.Setup(m => m.Method).Returns("GET"); 
request.Setup(h => h.Accept).Returns("application/x-protobuf"); 

的例外是:

System.NotSupportedException was unhandled by user code 
HResult=-2146233067 Message=Invalid setup on a non-virtual 
(overridable in VB) member: h => h.Accept Source=Moq StackTrace: 
     at Moq.Mock.ThrowIfCantOverride(Expression setup, MethodInfo method) 
     at Moq.Mock.<>c__DisplayClass1f`2.<SetupGet>b__1e() 
     at Moq.PexProtector.Invoke[T](Func`1 function) 
     at Moq.Mock.SetupGet[T,TProperty](Mock mock, Expression`1 expression, Func`1 condition) 
     at Moq.Mock.<>c__DisplayClass1c`2.<Setup>b__1b() 
     at Moq.PexProtector.Invoke[T](Func`1 function) 
     at Moq.Mock.Setup[T,TResult](Mock mock, Expression`1 expression, Func`1 condition) 
     at Moq.Mock`1.Setup[TResult](Expression`1 expression) 
     at HarmonyTests.MockWebRequestCreate.CreateTestRequest(Stream protobuf) 
+0

相關[問題](http://stackoverflow.com/q/9823039/1698557) – 2014-09-23 19:12:21

回答

3

你所要做的是不能使用起訂量。 Moq不能嘲笑一個具體實現的非虛擬方法(使用IInterface就可以)。

你有幾個選項,

  1. 創建一個使用實現了一個簡單的界面HttpWebRequest(如IHttpClient)和使用,在單元測試
  2. 使用不同的模擬框架(看看對於想法,請參閱this post)。