Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在不重置整个存根的情况下重置存根中某个属性的结果?_C#_Nunit_Rhino Mocks - Fatal编程技术网

C# 如何在不重置整个存根的情况下重置存根中某个属性的结果?

C# 如何在不重置整个存根的情况下重置存根中某个属性的结果?,c#,nunit,rhino-mocks,C#,Nunit,Rhino Mocks,我对犀牛模仿还不熟悉,所以我可能完全错过了一些东西 假设我有一个具有六个属性的接口: public interface IFoo { string Foo1 { get; } // Required non-null or empty string Foo2 { get; } // Required non-null or empty string Foo3 { get; } string Foo4 { get; } int Foo5 { get; } int Foo6

我对犀牛模仿还不熟悉,所以我可能完全错过了一些东西

假设我有一个具有六个属性的接口:

public interface IFoo {
  string Foo1 { get; } // Required non-null or empty
  string Foo2 { get; } // Required non-null or empty
  string Foo3 { get; }
  string Foo4 { get; }
  int Foo5 { get; }
  int Foo6 { get; }
}
以及采用类似对象但没有相同约束并创建IFoo实例的实现:

public interface IFooLikeObject {
  string FooLikeObject1 { get; } // Okay non-null or empty
  string FooLikeObject2 { get; } // Okay non-null or empty
  string FooLikeObject3 { get; }
  string FooLikeObject4 { get; }
  string FooLikeObject5 { get; } // String here instead of int
  string FooLikeObject6 { get; } // String here instead of int
}

public class Foo : IFoo {
  public Foo(IFooLikeObject fooLikeObject) {

    if (string.IsNullOrEmpty(fooLikeObject.Foo1)) {
      throw new ArgumentException("fooLikeObject.Foo1 is a required element and must not be null.")
    }

    if (string.IsNullOrEmpty(Foo2)) {
      throw new ArgumentException("fooLikeObject.Foo2 is a required element and must not be null")
    }

    // Make all the assignments, including conversions from string to int...

  }
}
现在在我的测试中,我想测试异常是否在适当的时间抛出,以及在从string到int的转换失败期间抛出的异常

因此,我需要太多的stub out IFooLikeObject来为我当前未测试的值返回有效值,因为我不想在每个测试方法中重复此代码,所以我将其提取到一个单独的方法中

public IFooLikeObject CreateBasicIFooLikeObjectStub(MockRepository mocks) {
  IFooLikeObject stub = mocks.Stub<IFooLikeObject>();

  // These values are required to be non-null
  SetupResult.For(stub.FooLikeObject1).Return("AValidString");
  SetupResult.For(stub.FooLikeObject2).Return("AValidString2");
  SetupResult.For(stub.FooLikeObject5).Return("1");
  SetupResult.For(stub.FooLikeObject6).Return("1");
}
例如:

[Test]
void Constructor_FooLikeObject1IsNull_Exception() {
  MocksRepository mocks = new MocksRepository();
  IFooLikeObject fooLikeObjectStub = CreateBasicIFooLikeObjectStub(mocks);

// This line causes the exception since FooLikeObject1 has already been set in CreateBasicIFooLikeObjectStub()
  SetupResult.For(fooLikeObjectStub.FooLikeObject1).Return(null); 

  mocks.ReplayAll();

  Assert.Throws<ArgumentException>(delegate { new Foo(fooLikeObjectStub); });
}
[测试]
无效构造函数\u傻瓜对象1isnll\u异常(){
MocksRepository mocks=新MocksRepository();
IFooLikeObject-doublikeobjectstub=CreateBasicIFooLikeObjectStub(mocks);
//此行导致异常,因为已在CreateBasicIFooLikeObjectStub()中设置了DuffikeObject1
SetupResult.For(傻瓜对象存根.傻瓜对象1).Return(null);
mocks.ReplayAll();
抛出(委托{new Foo(傻瓜对象存根);});
}

如何设置它,以便覆盖已设置了返回值的单个属性,而不必重做所有其他属性?

我可能遗漏了一些内容,但您尝试过这样做吗

var stub = mocks.Stub<IFooLikeObject>();

stub.FooLikeObject1 = "AValidString";
stub.FooLikeObject2 = "AValidString2";
stub.FooLikeObject5 = "1";
stub.FooLikeObject6 = "1";
var stub=mocks.stub();
stub.傻瓜对象1=“AValidString”;
stub.傻瓜对象2=“AValidString2”;
stub.傻瓜对象5=“1”;
stub.傻瓜对象6=“1”;
使用存根,您可以直接将属性设置为所需的属性

如果属性为只读,则可以按如下方式执行:

var stub = mocks.Stub<IFooLikeObject>();

stub.Stub( x => x.FooLikeObject1).Return("AValidString");
stub.Stub( x => x.FooLikeObject2).Return("AValidString2");
stub.Stub( x => x.FooLikeObject5).Return("1");
stub.Stub( x => x.FooLikeObject6).Return("1");
var stub=mocks.stub();
stub.stub(x=>x.傻瓜对象1).Return(“avaliString”);
stub.stub(x=>x.傻瓜对象2).Return(“AValidString2”);
stub.stub(x=>x.傻瓜对象5)。返回(“1”);
stub.stub(x=>x.傻瓜对象6)。返回(“1”);

我可能遗漏了什么,但你试过这么做吗

var stub = mocks.Stub<IFooLikeObject>();

stub.FooLikeObject1 = "AValidString";
stub.FooLikeObject2 = "AValidString2";
stub.FooLikeObject5 = "1";
stub.FooLikeObject6 = "1";
var stub=mocks.stub();
stub.傻瓜对象1=“AValidString”;
stub.傻瓜对象2=“AValidString2”;
stub.傻瓜对象5=“1”;
stub.傻瓜对象6=“1”;
使用存根,您可以直接将属性设置为所需的属性

如果属性为只读,则可以按如下方式执行:

var stub = mocks.Stub<IFooLikeObject>();

stub.Stub( x => x.FooLikeObject1).Return("AValidString");
stub.Stub( x => x.FooLikeObject2).Return("AValidString2");
stub.Stub( x => x.FooLikeObject5).Return("1");
stub.Stub( x => x.FooLikeObject6).Return("1");
var stub=mocks.stub();
stub.stub(x=>x.傻瓜对象1).Return(“avaliString”);
stub.stub(x=>x.傻瓜对象2).Return(“AValidString2”);
stub.stub(x=>x.傻瓜对象5)。返回(“1”);
stub.stub(x=>x.傻瓜对象6)。返回(“1”);

这可以使用
Repeat.Any()
构造来完成

我没有使用SetupResult对此进行测试。对于语法,它可以使用lambda语法:

public IFooLikeObject CreateBasicIFooLikeObjectStub(MockRepository) {
  IFooLikeObject stub = MockRepository.GenerateStub<IFooLikeObject>();

  // These values are required to be non-null
  stub.Stub(s => s.FooLikeObject1).Return("AValidString");
  stub.Stub(s => s.FooLikeObject2).Return("AValidString2");
  stub.Stub(s => s.FooLikeObject5).Return("1");
  stub.Stub(s => s.FooLikeObject6).Return("1");
}

[Test]
void Constructor_FooLikeObject1IsNull_Exception() {
  IFooLikeObject fooLikeObjectStub = CreateBasicIFooLikeObjectStub();

  // This line no longer causes an exception
  stub.Stub(s => s.FooLikeObject1).Return(null).Repeat.Any(); // The Repeat.Any() is key. Otherwise the value wont be overridden.

  Assert.Throws<ArgumentException>(delegate { new Foo(fooLikeObjectStub); });
}
public IFooLikeObject CreateBasicIFooLikeObjectStub(MockRepository){
IFooLikeObject存根=MockRepository.GenerateSub();
//这些值必须是非空的
stub.stub(s=>s.傻瓜对象1).Return(“avaliString”);
stub.stub(s=>s.傻瓜对象2).Return(“AValidString2”);
stub.stub(s=>s.傻瓜对象5)。返回(“1”);
stub.stub(s=>s.傻瓜对象6)。返回(“1”);
}
[测试]
无效构造函数\u傻瓜对象1isnll\u异常(){
IFooLikeObject-doublikeobjectstub=CreateBasicIFooLikeObjectStub();
//此行不再导致异常
stub.stub(s=>s.dublikeobject1).Return(null).Repeat.Any();//Repeat.Any()是键。否则该值不会被重写。
抛出(委托{new Foo(傻瓜对象存根);});
}

我发现唯一需要注意的是,不能重复两次。

这可以使用
Repeat.Any()
构造来完成

我没有使用SetupResult对此进行测试。对于语法,它可以使用lambda语法:

public IFooLikeObject CreateBasicIFooLikeObjectStub(MockRepository) {
  IFooLikeObject stub = MockRepository.GenerateStub<IFooLikeObject>();

  // These values are required to be non-null
  stub.Stub(s => s.FooLikeObject1).Return("AValidString");
  stub.Stub(s => s.FooLikeObject2).Return("AValidString2");
  stub.Stub(s => s.FooLikeObject5).Return("1");
  stub.Stub(s => s.FooLikeObject6).Return("1");
}

[Test]
void Constructor_FooLikeObject1IsNull_Exception() {
  IFooLikeObject fooLikeObjectStub = CreateBasicIFooLikeObjectStub();

  // This line no longer causes an exception
  stub.Stub(s => s.FooLikeObject1).Return(null).Repeat.Any(); // The Repeat.Any() is key. Otherwise the value wont be overridden.

  Assert.Throws<ArgumentException>(delegate { new Foo(fooLikeObjectStub); });
}
public IFooLikeObject CreateBasicIFooLikeObjectStub(MockRepository){
IFooLikeObject存根=MockRepository.GenerateSub();
//这些值必须是非空的
stub.stub(s=>s.傻瓜对象1).Return(“avaliString”);
stub.stub(s=>s.傻瓜对象2).Return(“AValidString2”);
stub.stub(s=>s.傻瓜对象5)。返回(“1”);
stub.stub(s=>s.傻瓜对象6)。返回(“1”);
}
[测试]
无效构造函数\u傻瓜对象1isnll\u异常(){
IFooLikeObject-doublikeobjectstub=CreateBasicIFooLikeObjectStub();
//此行不再导致异常
stub.stub(s=>s.dublikeobject1).Return(null).Repeat.Any();//Repeat.Any()是键。否则该值不会被重写。
抛出(委托{new Foo(傻瓜对象存根);});
}

我发现唯一的警告是你不能做两次。

是的。这正是我在
createBasicFoolikeObjectStub()
方法中所做的。问题是,在我的测试方法中,我可能希望调用
stub.stub(x=>x.傻瓜对象2).Return(null)
以验证在这种情况下是否引发异常。这就是我得到上面详述的残疾手术例外情况的时候。我将修改这个问题,使之更清楚。@Lawrence噢,我明白你的意思了。在这种情况下,您需要实际创建两个不同的存根实例,并使它们具有不同的值集。是的。这正是我在
createBasicFoolikeObjectStub()
方法中所做的。问题是,在我的测试方法中,我可能希望调用
stub.stub(x=>x.傻瓜对象2).Return(null)
以验证在这种情况下是否引发异常。这就是我得到上面详述的残疾手术例外情况的时候。我将修改这个问题,使之更清楚。@Lawrence噢,我明白你的意思了。在这种情况下,实际上需要创建两个不同的存根实例,并使它们具有不同的值集。