在unit中设置属性,不带参数



我有一个抽象的基类,我试图测试具有parameters和用于@ref的属性。我找不到一种方法来传递我的属性到我的Bunit渲染器。

我使用这个属性来存储我在整个基类中访问的信息。

public abstract class ColumnBase<TRowData> : ComponentBase
{
[Parameter] public string? Title { get; set; }
[Parameter] public RenderFragment<FunctionalColumn<TRowData>.CellInfo>? CellTemplate { get; set; }
public FunctionalColumn<TRowData> ColumnReference { get; protected set; } = default!;
}

这个类通常是这样使用的。在

StyledColumn.cs

@typeparam TRowData
@inherits ColumnBase<TRowData>
<FunctionalColumn
@ref=ColumnReference
Title=@Title
CellTemplate=CellTemplate
class="some styling" />

我正在尝试测试一些使用ColumnReference的功能,因此它不能为null..

首先,我试了这个。

ColumnBaseTests.cs

public class ColumnBaseTests : TestContext
{
[Fact]
public void TestRenderFragment()
{
var cb = new ColumnBase<TestData>() { FunctionalColumn = new FunctionalColumn() };
// then how to test render fragment?
// wanted something like cb.CellTemplate.MarkupMatches("my markup")
}
}

然后我试着用你在unit中做的实际标记方式做它。(注意,这个column有一个级联的grid,所以它是一个子)。然而,这也不能工作,因为没有[Parameter]属性的列。

[Fact]
public void CellTemplateIsSet()
{
var grid = RenderComponent<Grid<TestData>>(parameterBuilder => parameterBuilder
.AddChildContent<ColumnBase<TestData>>(parameters => parameters
.Add(p => p.FunctionalColumn , new FunctionalColumn <TestData>())
//.Add(p => p.Title, "..")
)
);
}

最后,我尝试传入它的一个实例。(注意,我必须用FunctionalColumn创建一个构造函数,只是为了看看它是否可以工作,但是,AddChildContent首先使用了正确的构造函数(带列的构造函数),然后使用了空白的构造函数,覆盖了它)。因此,当访问FunctionalColumn时,我得到了一个空异常。

[Fact]
public void CellTemplateIsSet()
{
var grid = RenderComponent<Grid<TestData>>(parameterBuilder => parameterBuilder
.AddChildContent<ColumnBase<TestData>>(p => new ColumnBase<TestData>(new FunctionalColumn()) { Title = ".."}
)
);
}

我最终的解决方案是只测试RenderFragement

var cellTemplateRenderFragment = Render(s => s.AddContent(1, new ColumnBase<TestData>(new FunctionalColumn()).CellTemplate, 
new FunctionalColumn<TestData>.CellInfo {
// some variable info to pass into the render fragement
}));
cellTemplateRenderFragment .MarkupMatches("my markup");

或者您可以创建一个可测试的类来设置底层属性。

private class TestableColumnBase<T> : ColumnBase<T>
{
[Parameter] public FunctionalColumn<T> FunctionalColumnParam {
get { return base.FunctionalColumn; }
set { base.FunctionalColumn = value; }
}

}

然后可以像

一样使用
[Fact]
public void CellTemplateIsSet()
{
var grid = RenderComponent<Grid<TestData>>(parameterBuilder => parameterBuilder
.AddChildContent<TestableColumnBase<TestData>>(parameters => parameters
.Add(p => p.FunctionalColumnParam , new FunctionalColumn<TestData>())
//.Add(p => p.Title, "..")
)
);
}

最新更新