2009-11-13 7 views
0

我正在尋找一些關於如何使用StructureMap或Unity與NUnit進行以下模擬測試的示例。StrucutureMap RhinoMock記錄/回放,需要的示例

我有以下代碼結構

public interface IDAL 
{ 
    List<Model> Method1(int id); 
} 

public class DAL : IDAL 
{ 
    public List<Model> Method1(int id) 
    { 
     List<Model> retval = new List<Model>(); 
     DbCommand cmd = GetStoredProcCommand("Model_Method1"); 
     using (IDataReader dr = DB.ExecuteReader(cmd)) 
     { 
      LoadEntityBaseList(retval, dr, PopulateDomain);//populate list based on reader 
     } 
     return retval; 
    } 
} 

public class Manager 
{ 
    private readonly IDAL m_DAL; 
    public Manager()  
    { 
     ObjectFactory.Initialize(x => x.ForRequestedType<IDAL>()); 
     m_DAL = ObjectFactory.GetInstance<IDAL>(); 

    } 

    public List<Domain> Method1(int id) 
    { 
     return m_DAL.Method1(id); 

    } 
} 

[TestFixture] 
public class ManagerTests 
    [Test] 
    public void Method1_Calls_DAL() 
    { 

     var list = new List<Model>(); 
     using (m_mock.Record()) 
     { 
      Expect.Call(_dal.Method1(1)).IgnoreArguments().Return(list); 
     } 
     using (m_mock.Playback()) 
     { 
      Manager manager = new Manager(); 
      var actual = manager.Method1(1); 
      Assert.That(actual, Is.Not.Null); 
     } 
    } 
} 

如果我包括StructureMap配置它忽略了模擬和Rhino.Mocks.MockRepository.VerifyAll()拋出異常。

如果我不包含structureMap配置,我會爲PluginFamily MyObject.IDAL定義No Default Instance。

有人能指出我正確的方向,我做錯了什麼?

回答

1

ObjectFactory.Initialize應該只在應用程序的生命週期中調用一次,因此從類構造函數中調用它是沒有意義的。

將ObjectFactory.Initialize()方法放在程序開始的某個位置(Web的Main()或Application_Start()),然後更改Manager以使其將IDAL作爲構造函數參數。

ObjectFactory.Initialize(...) 
var manager = ObjectFactory.GetInstance<Manager>(); 

public class Manager { 
public Manager(IDAL dal){ 
    m_DAL = dal; 
} 
... 
} 

然後在你的單元測試,你不使用StructureMap在所有 - 你只是在嘲笑IDAL傳遞給經理。

using (m_mock.Playback()) { 
Manager manager = new Manager(m_mock); 
+0

是,將工作,但 我試圖避免特殊外殼的構造只是爲了模仿測試 – Brian 2009-11-13 20:23:12

+0

這不是一個特例。這就是您在使用像StructureMap這樣的IOC工具時應如何設計您的類。 – 2009-11-14 17:24:44