2015-04-23 79 views
0

如此,因爲小巧玲瓏的使用擴展方法我包裹起來,我需要這樣的功能,我可以存根出來:MachineSpecs單元測試小巧玲瓏

public interface IDapperWrapper 
{ 
    Task<IEnumerable<dynamic>> ExecuteQuery(string needArg, string sql, DynamicParameters parameterDictionary, CommandType commandType); 
} 

我在DynamicParameters傳遞所以這意味着我的代碼創建這些,然後傳遞到在DapperWrapper :)

所以我Specs文件看起來像:

public class MyUnitTest : WithSubject<ClassCallingDapperWrapper> 
{ 
    protected static DynamicParameters DynamicParameters; 

    private Establish context =() => 
    { 
     The<IDapperWrapper>() 
     .WhenToldTo(
      x => 
      x.ExecuteQuery(
       Param.IsAny<string>(), 
       Param.IsAny<string>(), 
       Param.IsAny<DynamicParameters>(), 
       Param.IsAny<CommandType>())) 
     .Return(
      (string org, string sql, DynamicParameters dynParm, CommandType cmdType) => 
      { 
       DynamicParameters = dynParm; 

       return Task.FromResult(response); 
      }); 
    } 

    private It should_call_dapper_with_correct_params =() => 
    { 
     DynamicParameters dynParams = new DynamicParameters(); 
     dynParams.Add("@param1", "123"); 

     The<IDapperWrapper>().WasToldTo(x => x.ExecuteQuery(
       NeededArg, 
       sql, 
       Params.Any<DynamicParameters>(), 
       CommandType.StoredProcedure)); 
    }; 

    // Here I want to check that the DynamicParameters static field has the same parameters as the one I passed through. 
} 

那麼,如何實現這一最後L個國家統計局。我試過dynParams.Get<string>("param1"),但後來讀了另一篇文章,說你需要先閱讀。

我已經通過在DapperWrapper類中封裝DynamicParamters並通過Dictionary<string, object>來完成此操作,但這不僅會增加代碼量。它還增加了DapperWrapper中不可測試代碼的數量,這是不理想的。

忽視的事實是該規範將無法運行 - 它已被有意縮小

回答

0

我聽你的。我遇到了相同的問題,我必須放棄使用DynamicParameters(使用IEnumerable>),或者做你所做的事情。即使在使用mock進行單元測試時,我也必須進行一些回調以捕捉參數。我向Dapper團隊提交了一個允許訪問參數私有字典對象的請求,或者提供了允許我們查看輸入參數名稱和值的附加方法。