Rhino.Mocks:如何创建具有不同程序集全名的 class 的存根
Rhino.Mocks: How to create stub of a class with different assembly fullname
我尝试创建一个 class 的两个模拟对象,但它创建了两个具有相同程序集的模拟对象 "FullName"。
public class MyClassA : SomeAbstractClass, ISomeInterface1, ISomeInterface2
{
public MyClassA(string someData) : base(someData)
{
//this property defined in base class
CheckId = GetType().FullName;
}
internal override string CheckId { get; }
}
public class TestClass
{
[Test]
public void TestMethod()
{
var stub1 = new MockRepository().StrictMock<MyClassA>("some data 1");
var stub2 = new MockRepository().StrictMock<MyClassA>("some data 2");
Assert.AreEqual(stub1.CheckId, stub2.CheckId);
}
}
以上断言为真,我预计为假。
我知道我可以创建另一个提供 CheckId 的接口,但我想使用生产代码创建相同的环境。
所以我的问题是为什么即使 CheckId 属性不同,rhino mock 也会为不同的对象生成相同的 class 名称。
是否有任何其他方法可以在不更改测试逻辑的情况下创建相同 class 的不同模拟实例?
如果您需要其他详细信息,请告诉我。提前致谢。
更新:已解决
我找到了比手动更新 属性 更好的解决方案。制作通用类型的 MyClassA 解决了这个问题。如下所示;
public class MyClassA<TDummy> : SomeAbstractClass, ISomeInterface1, ISomeInterface2
{
public MyClassA(string someData) : base(someData)
{
//this property defined in base class
CheckId = GetType().FullName;
}
internal override string CheckId { get; }
}
public class TestClass
{
[Test]
public void TestMethod()
{
var mock1 = MockRepository.GenerateMock<MyClassA<int>>("some data 1");
var mock2 = MockRepository.GenerateMock<MyClassA<bool>>("some data 2");
Assert.AreEqual(stub1.CheckId, stub2.CheckId);
}
}
由于虚拟类型不同,每个生成的模拟都是相同基类型的不同实例。毕竟断言如我所料是错误的。
一种选择是手动设置 属性 以便它可以是唯一的
public class MyClassA : SomeAbstractClass, ISomeInterface1, ISomeInterface2 {
public MyClassA(string someData, string checkId) : base(someData) {
//this property defined in base class
CheckId = checkId;
}
internal override string CheckId { get; }
}
这样在模拟 类 时,您可以控制 属性
的设置
public class TestClass {
[Test]
public void TestMethod() {
var stub1 = new MockRepository().StrictMock<MyClassA>("some data 1", "checkId 1");
var stub2 = new MockRepository().StrictMock<MyClassA>("some data 2", "checkId 2");
Assert.AreEqual(stub1.CheckId, stub2.CheckId); //Should fail.
}
}
否则,如果要使用反射,你最好不要创建多个 类。
public class MyClassA : SomeAbstractClass, ISomeInterface1, ISomeInterface2 {
//...
}
public class MyClassB : SomeAbstractClass, ISomeInterface1, ISomeInterface2 {
//...
}
public class TestClass {
[Test]
public void TestMethod() {
var stub1 = new MockRepository().StrictMock<MyClassA>("some data 1");
var stub2 = new MockRepository().StrictMock<MyClassB>("some data 2");
Assert.AreEqual(stub1.CheckId, stub2.CheckId);
}
}
我尝试创建一个 class 的两个模拟对象,但它创建了两个具有相同程序集的模拟对象 "FullName"。
public class MyClassA : SomeAbstractClass, ISomeInterface1, ISomeInterface2
{
public MyClassA(string someData) : base(someData)
{
//this property defined in base class
CheckId = GetType().FullName;
}
internal override string CheckId { get; }
}
public class TestClass
{
[Test]
public void TestMethod()
{
var stub1 = new MockRepository().StrictMock<MyClassA>("some data 1");
var stub2 = new MockRepository().StrictMock<MyClassA>("some data 2");
Assert.AreEqual(stub1.CheckId, stub2.CheckId);
}
}
以上断言为真,我预计为假。
我知道我可以创建另一个提供 CheckId 的接口,但我想使用生产代码创建相同的环境。
所以我的问题是为什么即使 CheckId 属性不同,rhino mock 也会为不同的对象生成相同的 class 名称。
是否有任何其他方法可以在不更改测试逻辑的情况下创建相同 class 的不同模拟实例?
如果您需要其他详细信息,请告诉我。提前致谢。
更新:已解决
我找到了比手动更新 属性 更好的解决方案。制作通用类型的 MyClassA 解决了这个问题。如下所示;
public class MyClassA<TDummy> : SomeAbstractClass, ISomeInterface1, ISomeInterface2
{
public MyClassA(string someData) : base(someData)
{
//this property defined in base class
CheckId = GetType().FullName;
}
internal override string CheckId { get; }
}
public class TestClass
{
[Test]
public void TestMethod()
{
var mock1 = MockRepository.GenerateMock<MyClassA<int>>("some data 1");
var mock2 = MockRepository.GenerateMock<MyClassA<bool>>("some data 2");
Assert.AreEqual(stub1.CheckId, stub2.CheckId);
}
}
由于虚拟类型不同,每个生成的模拟都是相同基类型的不同实例。毕竟断言如我所料是错误的。
一种选择是手动设置 属性 以便它可以是唯一的
public class MyClassA : SomeAbstractClass, ISomeInterface1, ISomeInterface2 {
public MyClassA(string someData, string checkId) : base(someData) {
//this property defined in base class
CheckId = checkId;
}
internal override string CheckId { get; }
}
这样在模拟 类 时,您可以控制 属性
的设置public class TestClass {
[Test]
public void TestMethod() {
var stub1 = new MockRepository().StrictMock<MyClassA>("some data 1", "checkId 1");
var stub2 = new MockRepository().StrictMock<MyClassA>("some data 2", "checkId 2");
Assert.AreEqual(stub1.CheckId, stub2.CheckId); //Should fail.
}
}
否则,如果要使用反射,你最好不要创建多个 类。
public class MyClassA : SomeAbstractClass, ISomeInterface1, ISomeInterface2 {
//...
}
public class MyClassB : SomeAbstractClass, ISomeInterface1, ISomeInterface2 {
//...
}
public class TestClass {
[Test]
public void TestMethod() {
var stub1 = new MockRepository().StrictMock<MyClassA>("some data 1");
var stub2 = new MockRepository().StrictMock<MyClassB>("some data 2");
Assert.AreEqual(stub1.CheckId, stub2.CheckId);
}
}