C# 如何对调用了wcf客户端的服务进行单元测试
谢谢你,伊利亚。在伊利亚解释之后:我说了这个:C# 如何对调用了wcf客户端的服务进行单元测试,c#,wcf,unit-testing,asp.net-mvc-4,tdd,C#,Wcf,Unit Testing,Asp.net Mvc 4,Tdd,谢谢你,伊利亚。在伊利亚解释之后:我说了这个: [TestFixture] public class TestRefDataProvider { private IReferenceDataProvider _referenceDataProvider; [SetUp] public void SetUp() { _referenceDataProvider = new ReferenceD
[TestFixture]
public class TestRefDataProvider
{
private IReferenceDataProvider _referenceDataProvider;
[SetUp]
public void SetUp()
{
_referenceDataProvider = new ReferenceDataProvider();
}
[Test]
public void Verify_GetCountries()
{
Assert.IsNotNull(_referenceDataProvider.GetCountries());
}
}
公共类引用数据提供程序:IReferenceDataProvider
{
私有常量字符串REF_DATA_TITLE=“TitleData”;
private const string REF_DATA_COUNTRIES=“CountryData”;
专用只读ICrmService(CRMSSERVICE);
公共引用数据提供程序(ICrmService CRMSSERVICE)
{
_crmService=crmService;
}
公共IEnumerable GetCountries()
{
//如果在缓存中,则获取缓存版本
if(CacheManager.GetInstance.OCache.Contains(REF_DATA_COUNTRIES))
返回CacheManager.GetInstance.GetTypedItem(参考数据);
尝试
{
IEnumerable countriesDto=_crmService.LookupCountries(“*”);
bool addedToCache=CacheManager.GetInstance.AddItemWithExpiration(参考国家/地区、国家/地区、,
12);
如果(!addedToCache)抛出新异常(“无法将引用数据添加到缓存”);
}
捕获(例外情况除外)
{
LoggingManager.GetInstance.Log(“Error”,例如LoggingManager.LogLevel.Error);
投掷;
}
返回CacheManager.GetInstance.GetTypedItem(参考数据);
}
}
我的问题是我以前有过service.Close()。现在我不能用了。安全吗?如果
CrmServiceClient
是您的WCF服务,那么您应该有一个接口ICrmServiceClient
。
因此,您不应该在代码中创建CrmServiceClient
的新实例。您唯一需要的是依赖于ICrmServiceClient
(例如,通过构造函数)
框架是用来模拟依赖关系的。这很有意义。我想知道为crmserviceClient提供接口的最佳方式是什么。对于生成的类crmserviceClient,应该有一个接口ICrmService或CRMSSERVICE。谢谢Ilya。我编辑了我的问题。您能告诉我,您认为使用service.close和不使用service.close(使用Ioc)之间有什么区别吗?我不调用service.close()而依赖Ioc。好问题,现在我想检查一下IoC是如何使用这些代理的。嗨,你们中的任何一个知道如何处理
close()
方法了吗?
[TestFixture]
public class TestRefDataProvider
{
private IReferenceDataProvider _referenceDataProvider;
[SetUp]
public void SetUp()
{
_referenceDataProvider = new ReferenceDataProvider();
}
[Test]
public void Verify_GetCountries()
{
Assert.IsNotNull(_referenceDataProvider.GetCountries());
}
}
public class ReferenceDataProvider : IReferenceDataProvider
{
private const string REF_DATA_TITLE = "TitleData";
private const string REF_DATA_COUNTRIES = "CountryData";
private readonly ICrmService _crmService;
public ReferenceDataProvider(ICrmService crmService)
{
_crmService = crmService;
}
public IEnumerable<CountryLookupDto> GetCountries()
{
//if in cache then get cached version
if (CacheManager.GetInstance.OCache.Contains(REF_DATA_COUNTRIES))
return CacheManager.GetInstance.GetTypedItem<IEnumerable<CountryLookupDto>>(REF_DATA_COUNTRIES);
try
{
IEnumerable<CountryLookupDto> countriesDto = _crmService.LookupCountries("*");
bool addedToCache = CacheManager.GetInstance.AddItemWithExpiration(REF_DATA_COUNTRIES, countriesDto,
12);
if (!addedToCache) throw new Exception("Cannot add ref data to cache");
}
catch (Exception ex)
{
LoggingManager.GetInstance.Log("Error", ex, LoggingManager.LogLevel.Error);
throw;
}
return CacheManager.GetInstance.GetTypedItem<IEnumerable<CountryLookupDto>>(REF_DATA_COUNTRIES);
}
public class RefDataProvider : IRefDataProvider
{
private readonly ICrmServiceClient crmServiceClient;
public RefDataProvider(ICrmServiceClient crmServiceClient)
{
this.crmServiceClient = crmServiceClient;
}
public IEnumerable<CountryLookupDto> GetCountries()
{
/* your code */
}
}
[TestFixture]
public class TestRefDataProvider
{
private Mock<ICrmServiceClient> crmServiceClientMock;
private IReferenceDataProvider _referenceDataProvider;
[SetUp]
public void SetUp()
{
crmServiceClientMock = new Mock<ICrmServiceClient>();
crmServiceClientMock
.Setuo(/* your code */)
.Returns(/* your code */);
_referenceDataProvider = new ReferenceDataProvider(
crmServiceClientMock.Object
);
}
}