我有一个抽象的基类,我试图测试具有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, "..")
)
);
}