[英]Mocking database within WCF Service
我有一個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();
抱歉,您的問題尚不清楚,但如下所示。
如果您指的是單元測試,而不使用任何模擬對象框架,則類似以下內容。
//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
}
}
我在這里使用構造函數注入,但是您也可以使用屬性注入。 除非我有更多信息,否則很難確切地說。
我建議僅在單元測試項目中將調用放入模擬數據庫。 我建議不要為每個服務調用都添加一個if語句,以查看該調用是否要使用實時數據庫或模擬數據庫。
我最終為所有數據庫操作IDatabase
創建了一個IDatabase
,並創建了一個實現IDatabase
的Database
類。
然后,我創建了一個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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.