2014-07-03 18 views
0

我已經寫了一個函數,從數據庫中檢索一些數據(使用存儲過程,Oracle數據庫)。如何測試從C#中的Oracle參數

存儲過程有4個參數,其中一個是輸出參數。這裏是我的代碼:

string commandName = "someStoredProc"; 
List<IDataParameter> parameters = new List<IDataParameter>() { new SqlParameter("@param1", param1), new SqlParameter("@param2", param2), new SqlParameter("@param3", param3) }; 

SqlParameter calcId = new SqlParameter("@param4", SqlDbType.BigInt); 
calcId.Direction = ParameterDirection.Output; 

parameters.Add(calcId); 

Dictionary<long, ITrade> trades = _genericDataReader.ExecuteSqlQuery(parameters, CommandTypeEnum.Command, commandName); 

long CalculationID = (long)calcId.Value; 

此代碼工作正常。

現在我正在爲此編寫單元測試用例。我能夠模擬數據庫結果,無論我想要什麼,但不是這第四個參數:

測試失敗時它試圖將calcId.Value轉換爲長,因爲它爲空。

我該如何剔除這個參數值?

回答

0

這裏實際需要的是寫一個ExecuteSqlQuery的實現用於測試目的,它有權訪問參數並可以完成工作。
犀牛模擬提供了一些方法來添加自定義行爲嘲笑/存根(stub)。其中一種可能的方法是編寫The Do() handler

下面是一個簡單的例子:

_genericDataReader 
    .Stub(gdr => gdr.ExecuteSqlQuery(Arg<List<IDataParameter>>.Is.Anything, Arg<CommandTypeEnum>.Is.Anything, Arg<string>.Is.Anything)) 
    .Do((Func<List<IDataParameter>, CommandTypeEnum, string, IDictionary<long, ITrade>>)((param, cmd, cmdName) => 
    { 
     param[3].Value = 12L; 
     return null; // or return whatever is required dataset here 
    }));