Модульное тестирование элемента Blazor RenderFragment - PullRequest
0 голосов
/ 22 января 2019

Я начал писать метод для динамического построения элемента RenderFragment. Поэтому я также пытаюсь написать модульные тесты вместе с методом.

Я начинаю с очень базового элемента, и он не работает Вот конкретный тестируемый метод:

public RenderFragment buildFragment(string element, string elementContent, string[] attribute, string[] attributeContent)
    {
        RenderFragment content = builder => {
            builder.OpenElement(0, element);
            if (attribute != null)
            {
                for (int i = 0; attribute.Length - 1 >= i; ++i)
                {
                    builder.AddAttribute(0, attribute[i], attributeContent[i]);
                }
            }
            if (!string.IsNullOrEmpty(elementContent))
            {
                builder.AddContent(0, elementContent);
            }
            builder.CloseElement();
        };

        return content;
    }

Это мой первый базовый тест по методу, использующему xUnit:

public void BuildFragmentReturnsOneElement()
        {
            //Arrange
            RenderFragment fragment = builder =>
            {
                builder.OpenElement(0, "p");
                builder.CloseElement();
            };

            //Act
            RenderFragment result = _dynamicContentHelper.buildFragment("p", string.Empty, null, null);

            //Assert
            Assert.Same(fragment, result);
        }

Я получаю ошибку:

Сообщение: сбой Assert.Same () Ожидается: RenderFragment {Method = Void b__2_0 (Microsoft.AspNetCore.Blazor.RenderTree.RenderTreeBuilder), Target = <> c {}} Фактически: RenderFragment {Method = Void b__0 (Microsoft.AspNetCore.Blazor.RenderTree.RenderTreeBuilder), Target = <> c__DisplayClass0_0 {attribute = null, attributeContent = null, element = "p", elementContent = ""}}

Я не понимаю, почему Цель на моем фрагменте отличается от Цель на Результат .

1 Ответ

0 голосов
/ 26 января 2019

RenderFragment - это метод делегата, поэтому, когда вы пишете код, подобный следующему:

RenderFragment fragment = builder =>
            {
                builder.OpenElement(0, "p");
                builder.CloseElement();
            };

Вы не создаете материализованный артефакт, но объявляете делегата, который может быть вызван.

Таким образом, код Assert.Same(fragment, result); сравнивает двух делегатов, которые явно не совпадают - они указывают на два разных метода.

Я полагаю, вам следует исследовать папку "test" источника Blazor Source

Этот раздел может сильно помочь

Техника, которую они применяют, заключается в проверке фреймов RenderTree

// Act
var frames = GetRenderTree(component);

// Assert
Assert.Collection(
 frames,
 frame => AssertFrame.Component(frame, "Test.RenderChildContent", 2, 0),
 frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 1),
 frame => AssertFrame.Markup(frame, "\n  <div></div>\n", 2));

Также этот раздел сTestRenderer , в котором есть этот код

protected RenderTreeFrame[] GetRenderTree(IComponent component)
        {
            var renderer = new TestRenderer();
            renderer.AttachComponent(component);
            component.SetParameters(ParameterCollection.Empty);
            return renderer.LatestBatchReferenceFrames;
        }

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

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