VB.net中的自定义NUnit约束 - 无法覆盖ApplyTo

时间:2017-06-14 13:20:01

标签: vb.net nunit nunit-3.0

我正在尝试在vb.net中为nunit(3)编写自定义禁令。最简单的例子(跟随文档)将是:

Namespace MYConstraints
    Public Class MyConstraint
        Inherits NUnit.Framework.Constraints.Constraint

        Public Overrides Function ApplyTo(Of TActual)(actual As TActual) As NUnit.Framework.Constraints.ConstraintResult
            Throw New NotImplementedException()
        End Function
    End Class

End Namespace

(当我继承了nunit ApplyTo类时,Visual Studio会自动添加Constraint定义

问题是,它不会编译!

我收到两个错误:

  

BC30518重载解析失败,因为没有可访问的“那个”   使用这些参数调用:

     

'公共共享重载Sub(Of TActual)(del As ActualValueDelegate(Of TActual),expr As IResolveConstraint)':   无法推断出类型参数'TActual'。

     

'公共共享重载Sub(Of TActual)(实际为TActual,表达为IResolveConstraint)':   类型参数'TActual'不能   推断。

  

BC30935成员'公共MustOverride重载函数ApplyTo(Of   TActual)(实际为TActual)As ConstraintResult'与此匹配   签名不能被覆盖,因为类'Constraint'包含   具有相同名称和签名的多个成员:

     

'Public MustOverride重载函数ApplyTo(Of TActual)(实际为   TActual)作为ConstraintResult'       'Public Overridable Overloads Function ApplyTo(Of TActual)(ByRef actual as TActual)As ConstraintResult'

查看Constain class的{​​{3}}我看到他们已经定义了两个具有相同签名的变体:

/// <summary>
/// Applies the constraint to an actual value, returning a ConstraintResult.
/// </summary>
/// <param name="actual">The value to be tested</param>
/// <returns>A ConstraintResult</returns>
public abstract ConstraintResult ApplyTo<TActual>(TActual actual);

/// <summary>
/// Applies the constraint to an ActualValueDelegate that returns
/// the value to be tested. The default implementation simply evaluates
/// the delegate but derived classes may override it to provide for
/// delayed processing.
/// </summary>
/// <param name="del">An ActualValueDelegate</param>
/// <returns>A ConstraintResult</returns>
public virtual ConstraintResult ApplyTo<TActual>(ActualValueDelegate<TActual> del)
{
#if ASYNC
    if (AsyncInvocationRegion.IsAsyncOperation(del))
        using (var region = AsyncInvocationRegion.Create(del))
            return ApplyTo(region.WaitForPendingOperationsToComplete(del()));
#endif
    return ApplyTo(GetTestObject(del));
}

一个是带有pass-by-value参数的抽象,另一个是带引用参数的虚拟,但是在调用时这肯定不足以区分它们吗?

Visual Studio中的工具提示错误(VS 2015 Professional,如果它有所不同)是: nunit source 所以看起来它正在将ActualValueDelegate<TActual>解释为vb.net中的ByRef TActual

所以,有两个问题:

  1. 这怎么可能? (这是允许在C#但不是vb.net?或 我误解了什么吗?) - 这只是我很好奇:)

  2. 我应该如何在vb.net中编写自定义约束? (有没有人 一个例子?)这是我的主要问题:)

  3. 我越来越相信这是一个错误 - 在C#中有效的东西可能不会转换为vb.net。在enter image description here

    创建了一个错误

1 个答案:

答案 0 :(得分:0)

似乎被确认为nunit中的一个错误。见https://github.com/nunit/nunit/issues/2263