我们最近开始使用MediatR来允许我们解除控制器操作的混乱,因为我们重新考虑面向客户的大型门户并将其全部转换为C#.作为其中的一部分,我们也在增加我们的单元测试覆盖率,但是在尝试模拟MediatR本身时遇到了问题.
该命令执行一系列操作以启动进程,其中一部分是发送通知.通知本身由其自己的处理程序处理,因此将受其自己的单元测试的影响,因此我想模拟MediatR,以便this.mediator.Send(message)调用不会真正做任何事情.处理程序确实返回一个对象,但我们在这个上下文中并不关心它,因此对于所有意图和目的,我们将它视为一个void返回.我只想验证Send作为测试的一部分已被调用过一次.但是,Send方法是抛出一个NullReferenceException,我不知道为什么.
截至3版本,MediatR现在呈现出第二个可选参数Send,一个CancellationToken和表达式树需要你明确地设置他们,你必须指定一个值.我之前没有遇到过这种情况,在我看来,我觉得这可能是问题的一部分,但这可能是我的混淆.
这是一个减少的插图.
SUT
public class TransferHandler : IAsyncRequestHandler<TransferCommand, TransferResult>
{
private readonly IMediator mediator;
public TransferHandler(IMediator mediator)
{
this.mediator = mediator;
}
public async Task<TransferResult> Handle(TransferCommand message)
{
// Other stuff.
var notification = new TransferNotificationCommand()
{
ClientId = message.clientId,
OfficeId = message.OfficeId,
AuthorityFileId = letter?.Id
};
await this.mediator.Send(notification); // <=== This is where we get a NullReferenceException, even though nothing is actually null …Run Code Online (Sandbox Code Playgroud) 我正在将VB6应用程序迁移到.Net,我们必须始终提供类似功能.在一种形式中,树形视图具有三个级别的节点的复选框.第一级仅用于将下一级别分组,并且它们不可检查.第二级节点可由用户检查,当检查或取消选中时,其所有子节点都遵循.在所有级别,单击节点或其复选框将意味着它被选中,无论检查状态是否受到影响.
第三个层次是问题的关键(尽管问题本身在所有树视图复选框中显示):此级别包含两个"类型"的节点,一个可以由用户检查和取消选中(如果选中父级)和一个无论父级的状态如何,用户都无法检查或取消选中的类型,但其状态与其父级的状态相同.
在正常使用中,这一切都按预期工作.但是,如果您快速单击其中一个第三级节点(不应该是可以直接检查的)两次,它似乎会更改其检查状态.但是,如果您检查Checked属性的基础值,它仍然不受影响,因此它似乎只是一个显示问题.如果被发现,这种异常将成为我们客户的问题,因为用户可能认为他们可以做一些他们不能导致昂贵的混淆的事情.
我对这一点的想法很新鲜 - 有没有其他人观察到这种行为或了解它并且有解决方法/解决方案吗?我不禁感到我错过了一些非常明显的东西但是在一天半后我现在有了隧道视野.这里有一些代码来演示这个问题.创建一个带有树视图的表单(足够大以查看正在发生的事情),然后将两个按钮放入:
Private _node As TreeNode = Nothing
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MessageBox.Show(_node.Text & " : " & _node.Checked.ToString)
_node = Nothing
End Sub
Private Sub InitialiseTreeview()
TreeView1.Nodes.Clear()
Dim ran As New Random
Randomize()
For i As Int32 = 1 To 5
Dim TLNode As New TreeNode
Dim children As Int32 = 0
children = ran.Next(1, 5)
TLNode.Text = "Top Level Node " & i.ToString
For j As …Run Code Online (Sandbox Code Playgroud) 我有一个SQL查询,它应该在使用两个日期时间选择器选择的两个日期之间返回一些数据,但是当两个日期相等时,它应该返回该日的数据.我的查询没有返回任何内容,因为我的日期mm/dd/yyyy hh:mm:ss AM/PM格式.我使用日期时间选择器中的以下日期格式
dtpEndDate.Value.ToShortDateString()
Run Code Online (Sandbox Code Playgroud)
例如,当我的结束日期是2014年4月13日,那么它返回之前的数据,4/13/2014 00:00:00但我希望数据直到4/13/2014 23:59:59
我有以下查询
SELECT
sum(isnull(ExpectedAmt, 0)) AS Payment FROM Sales
WHERE (a.SellDate >= @StartDate) AND (a.SellDate <= @EndDate)
Run Code Online (Sandbox Code Playgroud)
我尝试了转换数据时间,但无法将其转换为日期时间类型.有没有更好的方法可以做到这一点?
c# ×2
.net ×1
mediatr ×1
moq ×1
sql-server ×1
treeview ×1
unit-testing ×1
winforms ×1
xunit ×1