gpt4 book ai didi

c# - 单元测试 Blazor RenderFragment 元素

转载 作者:太空宇宙 更新时间:2023-11-03 12:07:16 28 4
gpt4 key购买 nike

我已经开始编写动态构建 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);
}

我收到的错误是:

Message: Assert.Same() Failure Expected: RenderFragment { Method = Void b__2_0(Microsoft.AspNetCore.Blazor.RenderTree.RenderTreeBuilder), Target = <>c { } } Actual: RenderFragment { Method = Void b__0(Microsoft.AspNetCore.Blazor.RenderTree.RenderTreeBuilder), Target = <>c__DisplayClass0_0 { attribute = null, attributeContent = null, element = "p", elementContent = "" } }

我不明白为什么我的 fragment 对象上的 Targetresult 上的Target 不同。

最佳答案

RenderFragment 是一个 Delegate 方法,所以当你写这样的代码时:

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

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

因此,代码 Assert.Same(fragment, result); 正在比较两个委托(delegate),这显然不相同 - 它们指向两个不同的方法。

我相信您应该调查 Blazor Source 的“test”文件夹

This section may help a lot

他们应用的技术是检查 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));

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

看看他们是如何进行测试的,因为我无法在这里重现所有内容,但这些是关键...

关于c# - 单元测试 Blazor RenderFragment 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54307878/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com