代码之家  ›  专栏  ›  技术社区  ›  bilpor

Blazor renderfragment元素的单元测试

  •  1
  • bilpor  · 技术社区  · 6 年前

    我已经开始编写一个动态构建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_uu 2_0(microsoft.aspnetcore.blazor.rendertree.rendertreebuilder),target=<gt;c 实际值:renderFragment method=void b_uuu 0(microsoft.aspnetcore.blazor.rendertree.rendertreebuilder),target=<gt;c_uuDisplayClass0_attribute=null,attributeContent=null,element=“p”,elementContent=“”

    我不明白为什么 靶标 在我身上 片段 对象不同于 靶标 结果 .

    1 回复  |  直到 6 年前
        1
  •  0
  •   Mister Magoo    6 年前

    这个 RenderFragment 是委托方法,因此当您编写这样的代码时:

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

    您不是在创建物化工件,而是声明一个可以调用的委托。

    代码 Assert.Same(fragment, result); 因此,比较两个代表,这显然是不同的-他们指出两种不同的方法。

    我相信你应该调查一下Blazor源的“test”文件夹

    This section may help a lot

    他们应用的技术是检查渲染树的框架

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

    Also, this section with a TestRenderer 里面有这个代码

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

    看看他们是如何进行测试的,因为我不能在这里全部重现,但这些是关键…