WCF服务中的模拟数据库

本文关键字:模拟 数据库 服务 WCF | 更新日期: 2023-09-27 17:58:55

我有一个WCF服务,用于操作数据库表。我该如何为服务使用CCD_ 1而不是生产CCD_。

ID服务内的数据库接口:

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

实现IDatabase:的MockDatabase

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

客户端获取服务实例:

AuthenticationClient authorise = new AuthenticationClient();

WCF服务中的模拟数据库

对不起,您的问题不太清楚,但如下所示。

如果您引用的是单元测试,而不使用任何模拟对象框架,那么如下所示。。

//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
    }
}

我在这里使用构造函数注入,但您也可以使用属性注入。除非我有更多的信息,否则很难说清楚。

我建议只在单元测试项目中调用mock数据库。我建议不要为每个服务调用都放入if语句,看看该调用是想使用实时数据库还是模拟数据库。

我最终为所有数据库操作创建了一个接口IDatabase,并创建了实现IDatabaseDatabase类。

然后我创建了一个DatabaseMock类,它也实现了IDatabase,但是其方法体应在测试期间运行。

使用UnityMoq,我能够配置主项目的MockDatabase0和测试项目的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进行注释/取消注释它根据您可以更改的真实类或mock解析绑定根据您是否正在运行/测试

每当在我的应用程序中使用Database操作时,我都会使用代码:

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