Включение сведений об исключении при использовании размещенной службы Castle WCF Facility - PullRequest
0 голосов
/ 20 августа 2010

У меня проблемы с модульным тестированием небольшого количества кода при использовании Wcf Facility для Castle Windsor.Кажется, он отказывается включать подробности об исключениях, когда выдается исключение, я вижу только пустые исключения FaultExceptions.Это моя тестовая настройка:

Во-первых, вот заглушка службы, к которой я буду подключаться:

[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public abstract class StubAilDataService : IAilDataService
{
    public virtual Method1()
    {
    }
    /* More methods */
}

Обратите внимание, что я указал IncludeExceptionDetailsInFaults и установил его на true.

Вот так я размещаю службу-заглушку:

private ServiceHost _host;
private StubAilDataService _rhinoService;

[TestFixtureSetUp]
public void FixtureSetup()
{
    var sba = new ServiceDebugBehavior {IncludeExceptionDetailInFaults = true};
    _rhinoService = MockRepository.GeneratePartialMock<StubAilDataService>();

    _host = new ServiceHost(_rhinoService);
    _host.AddServiceEndpoint(typeof(IAilDataService), new WSHttpBinding("wsSecure"), "http://localhost:8080/Service");
    _host.Open();

    _container.AddFacility<WcfFacility>().Register(
        Component.For<IServiceBehavior>().Instance(sba),
        Component.For<IAilDataService>()
            .LifeStyle.PerWcfSession()
            .ActAs(new DefaultClientModel
                       {
                           Endpoint =
                               WcfEndpoint.BoundTo(new WSHttpBinding("wsSecure"))
                               .At("http://localhost:8080/Service")
                       }) // More stuff
        );
}

Я выполнил PartialMock, пытаясь сохранить атрибут Include .. на поддельном объекте.

И тест.Обратите внимание, что я приказываю моему смоделированному сервису выбросить здесь очень конкретное исключение.

[Test]
[ExpectedException(typeof(AggregateException))]
public void AnalyzeProductCreationJobs_Should_Throw_Aggregate_Exception_If_A_DataService_Call_Throws()
{
    //Arrange
    _rhinoService.Expect(
    s => s.CategoryIsInAgility(Arg<string>.Matches(str => str.Equals("000103")), Arg<Settings>.Is.Anything))
    .Throw(new FaultException<InvalidOperationException>(new InvalidOperationException("FAIL!")));

    var product = new Product { CategoryCode = "000103" };

    var analyzer = TypeResolver.Resolve<ProductAnalyzer>();

    //Act
    analyzer.AnalyzeProductCreationJobs(product);
}

И, наконец, код, который я на самом деле тестирую:

public class ProductAnalyzer
{
    private readonly IDataServiceClient _dataClient;

    public ProductAnalyzer(IDataServiceClient dataClient)
    {
        _dataClient = dataClient;
    }

    public IEnumerable<IAdsmlJob<CreateResponse>> AnalyzeProductCreationJobs(Product product)
    {
        IList<IAdsmlJob<CreateResponse>> creationJobs = new List<IAdsmlJob<CreateResponse>>();

        var task = Task.Factory.StartNew(() =>
        {
            // This is where the exception set up in my .Expect gets thrown.
            bool categoryIsInAgility = _dataClient.CategoryIsInAgility(product.CategoryCode);
            // Logic
        }); // Continued by more tasks

    try
    { task.Wait(); }
    catch (AggregateException ae)
    {
        ae.Flatten().Handle(ex => ex is TaskCanceledException);
    }
}

Я ожидаю, что сервиссбой и выбросить исключение, которое я настроил для выброса - но Wcf Facility, похоже, удаляет выброшенное исключение и заменяет его пустым FaultException вместо этого.

Я что-то упустил?Здесь довольно много компонентов, работающих вместе, и я не уверен на 100%, где что-то пойдет не так.

1 Ответ

0 голосов
/ 23 августа 2010

Вы должны явно объявить тип исключения ошибки, которое метод генерирует в интерфейсе.Пример:

[ServiceContract(Namespace = "http://www.example.com")]
public interface IAilDataService
{
    [OperationContract]
    [FaultContract(typeof(OperationPermissionFault))]
    [FaultContract(typeof(InvalidOperationException))]
    void Method1();
}

См. http://msdn.microsoft.com/en-us/library/system.servicemodel.faultcontractattribute.aspx

...