Как написать модульный тест в блоке Catch в Xunit? - PullRequest
0 голосов
/ 02 марта 2020

В следующей функции я хочу протестировать случай, когда с помощью XUnit генерируется исключение. Тест должен проверить, что исключение правильно выброшено.

public IDictionary<string, Label> Build(string content)
{
    try
    {
        var settings = new JsonSerializerSettings
        {
            MissingMemberHandling = MissingMemberHandling.Ignore
        };
        var contentStudioResponse = JsonConvert.DeserializeObject<ContentStudioResponse<CmsLabel>>(content, settings);

        if (contentStudioResponse?.Items == null)
        {
            _logger.Warning("No records found in content studio response for label:({@content})", content);
            return new Dictionary<string, Label>();

        }

        return contentStudioResponse.Items.ToDictionary(x => x.Key,
            x => new Label
            {
                Value = x.DynamicProperties.MicroContentValue
            }
        );
    }
    catch (Exception e)
    {
        _logger.Error(e, "Failed to deserialize or build contentstudio response for label");
        return new Dictionary<string, Label>();
    }
}

Ниже мое решение, которое не работает:

[Fact]
public void Builder_ThrowsException()
{
    string json_responsive_labels = "abcd";
    var builder = new LabelBuilder(_testLogger).Build(json_responsive_labels);
    Assert.Throws<Exception>(() => builder);
    //var sut = new LabelBuilder(_testLogger);            
    //Should.Throw<Exception>(() => sut.Build(json_responsive_labels));
}

1 Ответ

0 голосов
/ 02 марта 2020

Прочитайте это . Это объясняет, шаг за шагом, как проверить, было ли выброшено исключение.

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

   catch (Exception e)
   {
      _logger.Error(e, "Failed to deserialize or build contentstudio response for label");
      return new Dictionary<string, Label>();
   }

Что вы на самом деле хотите сделать, так это явно выдать исключение следующим образом:

   catch (Exception e)
   {
      throw new Exception();
   }

При этом ваш код выдаст исключение, которое вы можете поймать и проверить против.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...