【问题标题】:How to fake a datacontext method with TypeMock Isolator如何使用 TypeMock 隔离器伪造数据上下文方法
【发布时间】:2011-04-12 06:56:36
【问题描述】:

我想测试一个使用 Linq to SQL 的类。 我已经用 TypeMock Isolator 伪造了 datacontext,但是 datacontext 还有一个我不知道如何伪造的功能。 该函数用于Linq to Sql-queries。

函数传入两个参数(int?a, string b),返回一个整数; DC.MyMethod(int?a, string b)

我如何伪造这个?

//Fake datacontext
var fakeDC = Isolate.Fake.Instance<MyDataContext>();

//Fake --> this doesn't work
Isolate.WhenCalled((int? a, string b) => fakeDC.MyFunction(a,b).... ?

希望任何人都可以提供帮助

【问题讨论】:

  • “不起作用”不是错误描述。发生了什么?
  • 不要嘲笑它。将其抽象出来:bit.ly/gHLubu.

标签: c# unit-testing typemock typemock-isolator


【解决方案1】:

Isolator 默认忽略传递给函数的参数。要伪造你的,你可以简单地使用:

Isolate.WhenCalled(() => fakeDC.MyFunction(null, null)).WillReturn(...)

如果您需要确保使用特定参数调用它,请添加 WithExactArguments(),如下所示:

int? id = 10;
string name = "David";

Isolate.WhenCalled(() => fakeDC.MyFunction(id, name)).WithExactArguments().WillReturn(...);

希望对您有所帮助。

【讨论】:

  • 感谢您的回答,但是使用此解决方案我得到了 NullReferenceException。
  • 具体在哪里?您介意将堆栈跟踪发送到 support@typemock.com 吗?
【解决方案2】:

免责声明,我在 Typemock 工作。

为避免异常,您应该伪造 MyDataContext 的所有未来实例:

var fakeDC = Isolate.Fake.AllInstances<MyDataContext>();

然后设置 MyFunction() 的行为:

int? id = 10;
string name = "David";

Isolate.WhenCalled(() => fakeDC.MyFunction(id, name)).WithExactArguments().WillReturn(..);

它确保 MyDataContext 的所有实例都将被伪造(由程序的任何部分中的 new MyDataContext() 创建),并且 MyFunction() 行为也将被伪造。

由于我不了解所有细节,请查看以下示例以获得更多了解:

internal class Foo
{
    public Foo()
    {
    }

    public int Bar()
    {
        var x = new MyDataContext();
        return x.MyFunction(null, "5");
    }
}

public class MyDataContext : DataContext
{
   //
    public int MyFunction(int? a, string b)
    {
        if(a == null)
        {
            throw new Exception();
        }

        return 0;
    }
}

[TestMethod, Isolated]
public void TestMyDataContext()
{
     //Arrange
     var fakeDC = Isolate.Fake.AllInstances<MyDataContext>();
     Isolate.WhenCalled(() => fakeDC.MyFunction(null, "5")).WithExactArguments().WillReturn(6);

     //Act
     var foo = new Foo();
     var res = foo.Bar();

     //Assert
     Assert.AreEqual(6, res);
 }

在我们的docs 中查看所有信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多