我在这里有点失去理智了。当我最初构建 ListView 时,它完全按预期工作:
ListViewItem listViewItem = listView.Items.Add(model.Id.ToString(), model.Name, model.Id.ToString());
listViewItem.SubItems.AddRange(new ListViewItem.ListViewSubItem[]
{
new ListViewItem.ListViewSubItem() {Name = "ArtNr", Text = model.ArticleNumber},
new ListViewItem.ListViewSubItem() {Name = "Quantity", Text = "XXX"},
});
Run Code Online (Sandbox Code Playgroud)
我在控件中定义了 3 列,它们分别显示名称、文章编号和“XXX”。
在稍后阶段,我必须用实际数据替换“XXX”,并执行以下操作:
foreach (ListViewItem listViewItem in listView.Items)
{
InvoiceLine invoiceLine = FindInvoiceLine(...);
if (invoiceLine == null)
continue;
listViewItem.SubItems["Quantity"].Text = invoiceLine.Quantity.ToString();
}
Run Code Online (Sandbox Code Playgroud)
我可以看到文本实际上被设置在正确的 SubItem.Text 中,如果我稍后检查,同时通过不同的引用引用列表视图,即我知道我正在查看正确的对象。然而 GUI 并没有反映变化,它在第三列中仍然显示“XXX”。
是什么赋予了?!
我正在使用tSQLt对t-sql代码进行单元测试。
通常,测试的“安排”部分相当广泛,我试图将其中的大部分推到SetUp过程中,以便在类中的测试之间重用。
如果安装程序和测试过程可以“知道”相同的信息,即拥有一些共享数据,那将非常有用。例如,假设安装程序创建了测试发票并将发票ID设置为已知的值:
CREATE PROCEDURE [InvoiceManager].[SetUp]
AS
DECLARE @TestId INT = 10;
EXEC tsqlt.FakeTable @SchemaName='dbo', @TableName='Invoice';
INSERT INTO dbo.Invoice (Id, Amount) VALUES (@TestId, 20.50);
GO
Run Code Online (Sandbox Code Playgroud)
然后在测试中,我们想对测试发票进行处理,例如:
CREATE PROCEDURE [InvoiceManager].[Test_InvoiceHandler]
AS
DECLARE @TestId INT = 10; -- duplication I would like to eliminate
-- Action
EXEC dbo.InvoiceHandler @InvoiceId = @TestId;
-- Assert
-- ... some assertions
GO
Run Code Online (Sandbox Code Playgroud)
能够通过在SetUp过程中将@TestId的值推入某个“类变量”,然后在测试中使用它,来替换在两个(或更多过程)中复制@TestId的值将是一个很好的选择。有什么想法如何以紧凑的方式实现它吗?我可以想象在[InvoiceManager]模式中创建表并在测试中从中读取数据。是否有这样的机会存在,只是我在文档中找不到它?谢谢!