在WCF服务中模拟数据库

时间:2013-02-13 16:38:45

标签: c# database wcf unit-testing mocking

我有一个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();

3 个答案:

答案 0 :(得分:1)

抱歉,您的问题不完全清楚,但如下所示。

如果你指的是单元测试并且没有使用任何模拟对象框架,就像这样......

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

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

答案 1 :(得分:0)

我建议只在单元测试项目中调用mock数据库。我建议不要为每个服务调用添加一个if语句,以查看调用是否要使用实时数据库或模拟数据库。

答案 2 :(得分:0)

我最终为我的所有数据库操作IDatabase创建了一个界面,并创建了一个实现Database的{​​{1}}类。

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

使用IDatabaseUnity我能够配置主项目的Moq和测试项目的web.config以在运行时解析绑定:< / p>

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