2014-09-25 121 views
0

我喜歡模擬以下以確保ExecuteNonQuery被調用,但不知道該怎麼做,因爲我試過我得到了可能的異常,並且無法正確實現..我正在使用Rhino Mock如何模擬context.Database.Connection.CreateCommand

using (var command = _context.Database.Connection.CreateCommand()) 
      { 
       command.CommandText = @"testproc_ins"; 
       command.CommandType = CommandType.StoredProcedure; 
       SqlParameter[] parameters = GetParameters(transaction); 
       command.Parameters.AddRange(parameters); 
       command.Connection.Open(); 
       command.ExecuteNonQuery(); 
       command.Connection.Close(); 
      } 

回答

2

訣竅是如何安排你的代碼,以便你可以用你的模擬代替真實的物體。例如:

var command = CommandFactory.CreateCommand() 

並假設CreateCommand()在真實的CommandFactory如上,_context.Database.Connection.CreateCommand()實現,但在單元測試中,你有一個返回一個模擬代替的CommandFactory。

一旦你完成了這一切,在犀牛模擬很簡單:

var cmd = MockRepository.GenerateStub<IDbCommand>(); 
// Somehow pass mock cmd to code under test. For example, 
// CommandFactory here could itself be a mock, and you tell it 
// to return the mock cmd you created earlier: 
SomeObject.CommandFactory.Stub(c => c.CreateCommand()).Return(cmd); 
// Act 
// Do something 
// Assert 
cmd.AssertWasCalled(c => c.ExecuteNonQuery())); 
+0

你mean't說我需要在放置的CommandFactory和模擬的_context.Database.Connection.CreateCommand()他們。但我不喜歡爲單行創建一個CommandFactory類。 – 2014-09-25 09:52:38

+0

歡迎來到使用模擬對象進行單元測試的世界:)有時候這是一種痛苦,但是沒有其他簡單的方法 - 您必須以某種方式注入您的依賴關係,並且您的依賴關係是創建命令的對象。另一種方法是提供你自己的_context封裝,這樣_context.Database.Connection就在你的直接控制之下 - 但我不知道這是否容易。 – FarmerBob 2014-09-25 09:58:16

+0

嗨,你的第二個想法爲我工作。我將_context.Database.Connection作爲虛擬方法包裝到上下文類中,以便我可以通過嘲諷來控制它。謝了哥們。 – 2014-09-26 07:27:08