- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用 NUnit 和 NSubstitute 编写 C# 单元测试。我正在测试一个类,该类将尝试从实现以下接口(interface)的配置提供程序中检索对象:
public interface IConfigProvider<T> {
T GetConfig(int id);
T GetConfig(string id);
}
被测类只使用GetConfig
的int版本所以在 SetUpFixture 中,我执行以下操作来设置一个模拟的配置提供程序,它将始终返回相同的虚拟对象:
IConfigProvider<ConfigType> configProvider = Substitute.For<IConfigProvider<ConfigType>>();
configProvider.GetConfig(Arg.Any<int>()).Returns<ConfigType>(new ConfigType(/* args */);
如果 TestFixture 是唯一正在运行的,那么它运行得非常好。但是,在同一个程序集中的不同 TestFixture 中,我检查收到的调用是这样的:
connection.Received(1).SetCallbacks(Arg.Any<Action<Message>>(), Arg.Any<Action<long>>(), Arg.Any<Action<long, Exception>>());
如果这些Received
测试在配置提供程序测试之前运行,然后配置测试在 SetUpFixture 中失败并出现 AmbiguousArgumentsException:
Here.Be.Namespace.ProfileManagerTests+Setup (TestFixtureSetUp):
SetUp : NSubstitute.Exceptions.AmbiguousArgumentsException : Cannot determine argument specifications to use.
Please use specifications for all arguments of the same type.
at NSubstitute.Core.Arguments.NonParamsArgumentSpecificationFactory.Create(Object argument, IParameterInfo parameterInfo, ISuppliedArgumentSpecifications suppliedArgumentSpecifications)
at System.Linq.Enumerable.<SelectIterator>d__7`2.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at NSubstitute.Core.Arguments.MixedArgumentSpecificationsFactory.Create(IList`1 argumentSpecs, Object[] arguments, IParameterInfo[] parameterInfos)
at NSubstitute.Core.Arguments.ArgumentSpecificationsFactory.Create(IList`1 argumentSpecs, Object[] arguments, IParameterInfo[] parameterInfos, MatchArgs matchArgs)
at NSubstitute.Core.CallSpecificationFactory.CreateFrom(ICall call, MatchArgs matchArgs)
at NSubstitute.Routing.Handlers.RecordCallSpecificationHandler.Handle(ICall call)
at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
at NSubstitute.Routing.Route.Handle(ICall call)
at NSubstitute.Proxies.CastleDynamicProxy.CastleForwardingInterceptor.Intercept(IInvocation invocation)
at Castle.DynamicProxy.AbstractInvocation.Proceed()
at Castle.Proxies.IConfigProvider`1Proxy.GetConfig(Int32 id)
at Here.Be.Namespace.ProfileManagerTests.Setup.DoSetup()
真正让我感到困惑的是,如果我使用 NUnit GUI 来运行 Received
,我什至可以在测试运行之间观察到这种效果。单独测试,然后单独运行配置测试,配置测试将失败。如果我随后立即再次运行配置测试,它们就会通过。
我尝试过的事情:
configProvider.GetConfig(Arg.Any<string>()).Returns...
同样,以防重载是问题所在。碰巧,我正在使用的测试只会调用 GetConfig
值为 0 或 1 的方法,所以我可以只提供 Returns
这两个值的规范,根本不使用匹配,但我想了解如何更普遍地解决这个问题。
最佳答案
参数不明确是指当 NSubstitute 将参数与它当前正在使用的调用进行比较时,与它拥有的“参数匹配器”堆栈(每次 Arg.Blah
被调用时,参数匹配器被添加到那个堆栈),并且它无法解决哪个参数去哪里。
通常这是由于像 blah(null, null)
这样的调用导致的,只有一个参数匹配器在排队,但也可能是由于堆栈不同步导致的在调用配置之外使用的参数匹配器,或作为非虚拟方法的参数。
1.8.0 版(在您提出问题后发布)对后一种情况的检测略有改进,因此值得一试。
除此之外,我遇到过几次这个问题并使用了以下(痛苦的)方法。
Arg.xyz
的任何调用,这些调用可能会在任一测试中对参数匹配器进行排队。确保它用作调用配置的一部分。有时可以通过注释行或将 arg 匹配器替换为其他值来确定哪个调用有问题。有时问题可能是由于之前的夹具引起的,因此您可能需要锻炼之前的夹具并在那里进行探索。 :(
关于c# - NSubstitute - TestFixture 1 在 TestFixture 2 中导致 AmbiguousArgumentsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26805420/
我正在使用 NUnit 和 NSubstitute 编写 C# 单元测试。我正在测试一个类,该类将尝试从实现以下接口(interface)的配置提供程序中检索对象: public interface
我正在NUnit中设置测试,并且有一个新手问题。 是否有可能在多个[TestFixture]中使用的测试? 所以 [测试] ValidateString(字符串鲍勃) 可以在一系列不同的[TestFi
我有一个测试类和一个如下所示的类。 public class Foo { private IDbOjbect _db; public Foo(string conn) {
我有一个测试类和一个如下所示的类。 public class Foo { private IDbOjbect _db; public Foo(string conn) {
我有一大套测试用例。 我想运行 testfixtures 中的所有测试,一次一个。在 NUnit 中批量运行它们并不能满足我的要求。 为此,我想在列表中获取所有测试用例的名称并循环遍历它们。任何指针?
我有许多测试都安排了一些 TestFixtures,我发现我正在复制该安排代码很多。每个测试的前几行几乎相同。 有没有一种方法可以在所有测试中声明一个共享的 TestFixture,同时仍然在每个测试
我想为 testFixture 设置一个 Author 并在运行时获取它以便能够在我的数据库中获取它: 这是 TestFixture 类我为 testFixture 级别设置了 Nunit 属性作者:
我在 python 中有一个多模块包。其中一个模块本质上是一个命令行应用程序。我们将其称为“顶级”模块。另一个模块中有三个类,它们本质上是应用程序的后端。 顶层模块,在它的类的初始化中,执行 logg
您如何解决您尝试定义的 TestFixture 需要引用没有无参数构造函数的类型的情况? 我正在尝试测试具有多个实现的接口(interface)。在 NUnit 文档中,它展示了如何使用这样的泛型进行
有三种组织单元测试的方法:按夹具、类或功能测试。但是 TestClass 的 NUnit 属性称为 TestFixture。这有什么历史原因吗? 最佳答案 主要的历史原因是 NUnit 最初是作为 J
对于具有 TestFixture 的类,我看不到任何行为差异。属性而不是。全部 TearDown和 SetUp以同样的方式工作。除了语义之外,这个属性使用还有什么原因吗? 最佳答案 纯粹是为了方便,从
我有一个 TestFixture 标记的类,它正在对名为“HideCurrentTitleBarMessageTask”的类的功能进行单元测试。 在这个类中,我使用替代方法在 [Setup] 方法中模
我有两个测试类,如本例所示: [TestFixture] class BaseTest { [SetUp] public void SetupMethodA() { } } [
我需要在我的 NUnit c# 应用程序中订购测试装置。我有一个关于如何从 this page 运行有序测试方法的示例,并且我尝试使用示例应用程序中提供的相同方法为测试装置实现相同的逻辑。在我们的应用
我有两个名为“TT_Common”和“TT_Container”的测试类,它们扩展了 CPPUNIT_NS::TestFixture: class TT_Common : public CPPU
我知道如何从 C# 代码运行完整的 NUnit 程序集 TestPackage testPackage = new TestPackage(assemblyName); RemoteTestRunne
我有一个测试类如下: [TestFixture("someurl1", new[] { "param1", "param2" }, 15)] [TestFixture("someurl2", new[
我对能够在运行时通过静态方法或返回 IEnumerable 的属性传递给它的构造函数参数实例化多个 testfixtures 感兴趣。 在 Nunit 2.5 中,他们引入了参数化测试和测试装置。这些
在 NUnit 中,我们可以简单地通过指定多个 [TestFixture] 属性,使用不同的参数多次运行测试夹具,每个属性都会导致类被实例化指定属性参数。 这是一个例子: [TestFixture("
我遵循示例代码here尝试设置带有用于单元测试的装置的测试MySQL数据库。我有以下代码。 func prepareTestDatabase() (*sql.DB, error) { err
我是一名优秀的程序员,十分优秀!