WCF服务中的模拟数据库
本文关键字:模拟 数据库 服务 WCF | 更新日期: 2023-09-27 17:58:55
我有一个WCF服务,用于操作数据库表。我该如何为服务使用CCD_ 1而不是生产CCD_。
ID服务内的数据库接口:
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
}
}
我在这里使用构造函数注入,但您也可以使用属性注入。除非我有更多的信息,否则很难说清楚。
我建议只在单元测试项目中调用mock数据库。我建议不要为每个服务调用都放入if语句,看看该调用是想使用实时数据库还是模拟数据库。
我最终为所有数据库操作创建了一个接口IDatabase
,并创建了实现IDatabase
的Database
类。
然后我创建了一个DatabaseMock
类,它也实现了IDatabase
,但是其方法体应在测试期间运行。
使用Unity
和Moq
,我能够配置主项目的MockDatabase
0和测试项目的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
进行注释/取消注释它根据您可以更改的真实类或mock解析绑定根据您是否正在运行/测试
每当在我的应用程序中使用Database
操作时,我都会使用代码:
var unity = new UnityContainer().LoadConfiguration();
var proxy = unity.Resolve<IDatabase>();
proxy.AddNewProduct(product);