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