簡體   English   中英

WCF服務中的模擬數據庫

[英]Mocking database within WCF Service

我有一個WCF服務,可在其中操作數據庫表。 如何為服務傳遞一些參數,以將MockDatabase用作測試目的,而不是生產Database

服務內的IDatabase接口:

public interface IDatabase
{
    void addNewProduct(Product product);
}

實現IDatabase的MockDatabase:

public class MockDatabase : IDatabase
{
    public void addNewProduct(Product product)
    {
        //some impl
    }
}

客戶端獲取服務實例:

AuthenticationClient authorise = new AuthenticationClient();

抱歉,您的問題尚不清楚,但如下所示。

如果您指的是單元測試,而不使用任何模擬對象框架,則類似以下內容。

//production code/project
public interface IDatabase {
    void addNewProduct(Product product);
}

public class SystemUnderTest {
    private IDatabase _database;
    public SystemUnderTest(IDatabase database) {
        _database = database;
    }

    public void DoSomthing(Product product) {
        _database.addNewProduct(product);
    }
}

//Unit Test project
public class MockDatabase : IDatabase {
    public void addNewProduct(Product product)
    { //mock implementation}
}

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        //Arrange
        var mock = new MockDatabase();
        var fakeProduct = new Product();
        mock.addNewProduct(fakeProduct );
        var sut = new SystemUnderTest(mock);

        //Act
        sut.DoSomthing(product);

        //Assert
        //Whatever you like to assert
    }
}

我在這里使用構造函數注入,但是您也可以使用屬性注入。 除非我有更多信息,否則很難確切地說。

我建議僅在單元測試項目中將調用放入模擬數據庫。 我建議不要為每個服務調用都添加一個if語句,以查看該調用是否要使用實時數據庫或模擬數據庫。

我最終為所有數據庫操作IDatabase創建了一個IDatabase ,並創建了一個實現IDatabaseDatabase類。

然后,我創建了一個DatabaseMock類,該類也實現了IDatabase ,但應在測試期間運行更改后的方法主體。

使用UnityMoq我可以配置主項目的web.config和測試項目的app.config來在運行時解析綁定:

<configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
  </configSections>

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <assembly  name="Ecommerce_WCF"/>
    <assembly  name="Ecommerce_WCF_Test"/>

    <alias alias="IDatabase" type="Ecommerce_WCF.IDatabase, Ecommerce_WCF" />
    <alias alias="Database" type="Ecommerce_WCF.Database, Ecommerce_WCF" />
    <alias alias="DatabaseMock" type="Ecommerce_WCF.DatabaseMock, Ecommerce_WCF" />

    <container>
      <register type="IDatabase" mapTo="Database" />


      <!--<register type="IDatabase" mapTo="DatabaseMock" />-->
    </container>
  </unity>

container標簽中,根據注釋/未注釋的register type它根據真實類或模擬對象解析綁定,您可以根據運行還是測試來更改模擬對象

每當在我的應用程序中使用Database操作時,我都會使用以下代碼:

var unity = new UnityContainer().LoadConfiguration();
            var proxy = unity.Resolve<IDatabase>();
            proxy.AddNewProduct(product);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM