2013-02-13 4 views
0

У меня есть служба WCF, где я управляю таблицами базы данных. Как передать какой-либо аргумент для , чтобы использовать MockDatabase для целей тестирования, а не для производства Database.Mocking database в службе WCF

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(); 

ответ

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); 
0

Я рекомендовал бы поставить вызов на издеваться базы данных только в проекте единичного тестирования. Я бы порекомендовал не помещать оператор if для каждого вызова службы, чтобы узнать, хочет ли он использовать живую базу данных или издевательскую базу данных.

+0

Да, но как бы я указать службу, чтобы использовать эту конкретную базу данных? – Neeta

+0

Вы всегда можете переместить вещи в файл конфигурации. Все, что может быть специфичным для окружающей среды. – ryan1234

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

Я использую инъекции конструктора, но вы также можете использовать инъекции собственности. Труднее сказать, если у меня больше информации.