0

我有一个 WCF 服务,我在其中操作数据库表。如何为服务传递一些参数以MockDatabase用于测试目的而不是生产Database

服务内的 IDatabase 接口:

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

MockDatabase 实现 IDatabase:

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

客户端获取服务实例:

AuthenticationClient authorise = new AuthenticationClient();
4

3 回答 3

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

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

于 2013-02-14T11:07:54.077 回答
0

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

于 2013-02-13T19:51:32.620 回答
0

我最终为我的所有数据库操作创建了一个接口IDatabase,并创建了一个Database实现IDatabase.

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

使用Unity并且Moq我能够配置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);
于 2013-02-21T11:59:44.397 回答