2013-04-24 141 views
7

我试图通过添加一些硒功能扩展新的xUnit断言类断言

namespace MyProject.Web.Specs.PageLibrary.Extensions 
{ 
    public static class AssertExtensions 
    { 
     public static void ElementPresent(this Assert assert, ...) 
     { 
      if (...) 
      { 
       throw new AssertException(...); 
      } 
     } 
    } 
} 

延长的xUnit断言方法但当我尝试使用它,我得到这个编译错误。

using MyProject.Web.Specs.PageLibrary.Extensions;  
using Xunit; 
... 

public void DoSomething() 
{ 
    Assert.ElementPresent(...); 
} 

和错误

Error 5 'Xunit.Assert' does not contain a definition for 'ElementPresent' 

有谁知道这是可能的,或者我要去哪里错了吗?

回答

3

您需要将作为此参数传递给扩展方法的对象实例。 在你的情况,这将是正确的语法

var assert = new Assert(); 
assert.ElementPresent(...); 

但我想你并不需要,甚至不能断言创建类的实例。

你想要做的是调用扩展方法作为扩展类的静态调用,并且不会工作。 但是,为什么不只需拨打

AssertExtensions.ElementPresent(...); 
+0

谢谢,这解释了为什么我无法断言,延长像我想要的。你的解决方案几乎是我最终做的,但我打电话给我'SeleniumAssert.ElementPresent(...);' – Neil 2013-04-25 09:42:06

+1

对于xUnit 2,请查看https://github.com/xunit/samples.xunit /blob/master/AssertExtensions/StringAssertionExtensions.cs – Jedidja 2016-03-05 16:02:51

3

很抱歉,但你感到困惑(编辑:!所以是我)。 xUnit.net的Assert static,因此不能添加扩展名(尽管其他断言库不会提出这种方法,这就是为什么人们可能期望使用扩展方法来扩展 Assert)。因此,在xUnit.net Universe中,如果要添加自定义断言,请添加具有不同名称的新静态类。

public static class AssertExtensions 
{ 
    public static void ElementPresent(this Assert assert, ...) 

到:

public class AssertExtensions : XUnit.Assert 
{ 
    public static void ElementPresent(...) 

,然后使用@加入BradWilson的惯用伎俩:

using Assert = MyProject.Web.Specs.PageLibrary.Extensions.AssertExtensions; 

您可以通过它来改变你的类让你的方法工作任何需要扩展名的文件的顶部。

这种技术非常适合添加过载来想起来....

(最明显的弱点是,你不能有一个以上的通过Assert.虽然直接访问)

+0

Assert类不是静态的,但里面的方法是静态的,这就是抛弃我的东西。查看@jure的解决方案 – Neil 2013-04-25 09:47:00

+0

@Neil。感谢downvote。我正在和@xunit进行交谈,看看'Assert'是否可以成为一个静态类,以避免任何其他人遇到这种情况(这让我感到惊讶,因为xUnit.net依赖于允许静态类的.NET 2.0,而我不能想想如何改变可能会破坏) – 2013-04-25 11:24:00

+0

@尼尔啊,似乎它可能已经开放,以启用[这里]描述的扩展技巧(https://xunit.codeplex.com/discussions/15792)。最后,我确信这是静态的原因 - Brad Wilson自己告诉我这是: - https://xunit.codeplex.com/discussions/238521 – 2013-04-25 11:29:04

10

编辑2 xUnit 2最终最终将断言移动到单独的程序集中。 NuGet上只有编译和源代码包,而Assert类是部分的,所以通过使用包的源代码版本,Assert变得非常容易扩展(在C#中)。

编辑为了更加完整:xUnit 2删除了这个扩展点,并建议使用沿着'流利'断言库的扩展方法。


为了完整起见,这里的延伸Assert的“官方”的描述(这些令人惊讶尚未在所有提到,尽管布拉德·威尔逊甚至加入了讨论)。

从版本1.5(根据Brad的博客),xUnit.Extensions通过AssertionsTestClass类明确支持此类。它的工作原理是这样的:

TestClass有一个名为Assert属性,是Assertions类型的继电器上Xunit.Assert所有方法。因为TestClass.Assert是一个实例,你可以在Assertions通过扩展方法方法添加到它:

public static class AssertionsExtensions 
{ 
    public static void DeepEquals(this Assertions assertions, XNode expected, XNode actual) 
    { 
     assertions.True(XNode.DeepEquals(expected, actual)); // You can also use Assert.True here, there's effectively no difference. 
    } 
} 

现在你需要让你的测试类从Xunit.Extensions.TestClass(容易混淆的派生,也有Xunit.TestClass,这是不是你想要的),如果您不明确限定名称,则Assert属性将“隐藏”Xunit.Assert类型。

在您的测试类,从TestClass派生,你现在可以使用

Assert.DeepEquals(expectedXml, actualXml); 

唯一真正的区别,从内置的xUnit断言(除了一个事实,即语法着色为Assert是一个标识符,而不是类型)是,当它失败时,您只需获得一个TrueException,而不是一个具体的DeepEqualsException,它可以假设告诉你哪里的比较失败。但是,当然你也可以用同样的方式来构建它。

+0

看看Ruben Bartelink的帖子..下面。结合这里的知识,它会导致从全局创建你自己的派生类:: XUnit.Assert – Robetto 2015-07-09 13:19:30

+1

而对于xUnit 2,最简单的方法是查看例如https://github.com/xunit/samples.xunit /blob/master/AssertExtensions/StringAssertionExtensions.cs – Jedidja 2016-03-05 16:02:41

3

解决方案摘要xUnit 2。 (在NuGet中为我工作2.1.0版本。)

Assert是一个部分类,您可以通过添加另一部分来扩展。为了能够做到这一点,你需要从源代码编译Assert程序集。你可以使用xunit.assert.source NuGet来获取源代码。

步骤

  1. 删除参照从项目xunit.assert NuGet包。
  2. 改为安装xunit.assert.source包。
  3. Xunit命名空间中,定义public partial class Assert并在其中添加自定义断言。自定义断言的

例子:

namespace Xunit 
{ 
    public partial class Assert 
    { 
     public static void ArraySegmentEqual<T>(
      T[] expectedSequence, T[] buffer, int offset = 0) 
     { 
      for (int i = 0; i < expectedSequence.Length; i++) 
      { 
       int b = i + offset; 

       True(buffer[b].Equals(expectedSequence[i]), 
        $"Byte #{b} differs: {buffer[b]} != {expectedSequence[i]}"); 
      } 
     } 
    } 
} 

注:其他答案,编辑还指出,解决方案,但它花了我不少大部头从那里弄明白。另外,我不认为这是唯一或最好的选择。

0

对于的xUnit 2+

1)添加xunit.assert.source NuGet包与扩展项目。

2)创建局部类定义:

namespace xUnit 
{ 
    public partial class Assert 
    { 
    public static void ElementPresent(...) 
    { 
    } 
    } 
}