0

データベーステーブルを操作する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();
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

最終的に、すべてのデータベース操作用のインターフェースを作成し、 を実装するクラスIDatabaseを作成しました。DatabaseIDatabase

DatabaseMock次に、も実装するクラスを作成しましたIDatabaseが、テスト中に実行するメソッド本体を変更しました。

を使用Unityして、メイン プロジェクトの とテスト プロジェクトのMoqを構成し、実行時にバインドを解決することができました。web.configapp.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 に答える
0

単体テスト プロジェクトでのみ、モック データベースへの呼び出しを配置することをお勧めします。すべてのサービス呼び出しに if ステートメントを入れて、その呼び出しがライブ データベースを使用するのか、モック データベースを使用するのかを確認しないことをお勧めします。

于 2013-02-13T19:51:32.620 に答える