标签: rhino-mocks

如何在ASP.Net MVC中模拟Controller上的请求?

我使用ASP.Net MVC框架在C#中有一个控制器

public class HomeController:Controller{
  public ActionResult Index()
    {
      if (Request.IsAjaxRequest())
        { 
          //do some ajaxy stuff
        }
      return View("Index");
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到了一些关于模拟的技巧,并希望用以下和RhinoMocks测试代码

var mocks = new MockRepository();
var mockedhttpContext = mocks.DynamicMock<HttpContextBase>();
var mockedHttpRequest = mocks.DynamicMock<HttpRequestBase>();
SetupResult.For(mockedhttpContext.Request).Return(mockedHttpRequest);

var controller = new HomeController();
controller.ControllerContext = new ControllerContext(mockedhttpContext, new RouteData(), controller);
var result = controller.Index() as ViewResult;
Assert.AreEqual("About", result.ViewName);
Run Code Online (Sandbox Code Playgroud)

但是我一直收到这个错误:

异常System.ArgumentNullException:System.ArgumentNullException:值不能为null.参数名称:System.Web.Mvc.AjaxRequestExtensions.IsAjaxRequest(HttpRequestBase请求)中的请求

由于Request控制器上的对象没有setter.我尝试使用以下答案中的推荐代码使此测试正常工作.

这使用了Moq而不是RhinoMocks,并且在使用Moq时我使用以下内容进行相同的测试:

var request = new Mock<HttpRequestBase>();
// Not working - IsAjaxRequest() is static extension method and cannot be mocked …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc unit-testing rhino-mocks moq mocking

169
推荐指数
6
解决办法
8万
查看次数

Rhino Mocks上的模拟和存根之间有什么区别?

我没有玩这个并且通常使用嘲讽,但我想知道这两者之间的差异以及何时使用犀牛模拟中的一个或另一个.

更新:

我也用Ayende的话来找到我的问题的答案:

存根和模拟之间的区别

您可以在本文中获得这些术语的实际定义:模拟不是存根.我想从Rhino Mocks的角度来关注差异.

模拟是一个我们可以设置期望的对象,它将验证预期的操作确实已经发生.存根是您用于传递给测试代码的对象.您可以设置它的期望,因此它会以某种方式起作用,但这些期望永远不会得到验证.存根的属性将自动表现为普通属性,您无法设置它们的期望.

如果要验证测试代码的行为,您将使用具有适当期望的模拟,并验证.如果您只想传递可能需要以某种方式执行的值,但不是此测试的焦点,则将使用存根.

重要信息:存根永远不会导致测试失败.

rhino-mocks mocking

148
推荐指数
4
解决办法
6万
查看次数

使用C#和RhinoMocks进行测试驱动开发的最佳实践

为了帮助我的团队编写可测试的代码,我提出了这个简单的最佳实践列表,以使我们的C#代码库更易于测试.(有些观点指的是Rhino Mocks的限制,这是C#的模拟框架,但规则也可能更普遍适用.)有没有人有他们遵循的最佳实践?

要最大限度地提高代码的可测试性,请遵循以下规则:

  1. 首先编写测试,然后编写代码.原因:这可确保您编写可测试代码,并确保每行代码都为其编写测试.

  2. 使用依赖注入设计类.原因:你无法模拟或测试无法看到的东西.

  3. 使用Model-View-Controller或Model-View-Presenter将UI代码与其行为分开.原因:允许在无法测试的部分(UI)最小化的同时测试业务逻辑.

  4. 不要编写静态方法或类. 原因:静态方法难以或无法隔离,Rhino Mocks无法模拟它们.

  5. 编程关闭接口,而不是类.原因:使用接口阐明了对象之间的关系.接口应该定义对象从其环境中需要的服务.此外,可以使用Rhino Mocks和其他模拟框架轻松模拟接口.

  6. 隔离外部依赖项.原因:无法测试未解析的外部依赖项.

  7. 将您想要模拟的方法标记为虚拟.原因:Rhino Mocks无法模拟非虚方法.

c# tdd unit-testing rhino-mocks

86
推荐指数
3
解决办法
3万
查看次数

模拟Asp.net-mvc控制器上下文

因此控制器上下文取决于一些asp.net内部.有什么方法可以干净地模拟这些单元测试?当我只需要例如Request.HttpMethod来返回"GET"时,似乎很容易堵塞大量设置的测试.

我在网上看过一些例子/助手,但有些已经过时了.认为这将是保持最新和最伟大的好地方.

我正在使用最新版本的犀牛嘲笑

asp.net-mvc unit-testing rhino-mocks moq mocking

68
推荐指数
5
解决办法
4万
查看次数

Castle DynamicProxy - 创建涉及用作GTR的GTP的代理时失败

好的,现在我真的很困惑.

我最初遇到这个问题,根据海报,问题是Castle.DynamicProxy的版本是ILMerged到最新的Rhino.Mocks库.据该主题的一些权威人士称,它已经在最新的城堡中得到了修复,但该库还没有成为新的Rhino.Mocks.大多数人都说"只需下载Rhino源代码和最新的Castle并构建自己的版本".

所以,我做到了这一点; 我从Ayende的GitHub抓起一个Rhino主干来源的ZIP,打开它并建造它.然后,就像一个好的小TDDer,我创建了一个单元测试,以确保我的更改工作(因为最新的Castle将DynamicProxy折叠到Core中,需要一些重要的引用更改):

    [Test]
    public void MockOfInterfaceMethodWithInterfaceGTR()
    {
        var mock = mocks.DynamicMock<ITestRestrictedInterface>();
        Assert.NotNull(mock);
        Expect.Call(mock.TestMethod(new Object2())).IgnoreArguments().Return(5);
        mocks.ReplayAll();
        Assert.AreEqual(5, mock.TestMethod(new Object2()));
    }

...

internal interface ITestGenericInterface<TRest> where TRest:IObject1
{
    int TestMethod<T>(T input) where T : TRest;
}

internal interface ITestRestrictedInterface:ITestGenericInterface<IObject2> { }

internal interface IObject1 { }
internal interface IObject2:IObject1 { }

internal class Object2:IObject2 { } 
Run Code Online (Sandbox Code Playgroud)

结果,在我自己的生产代码中使用最新发布的Rhino运行?失败并显示以下消息:

System.TypeLoadException:来自程序集'DynamicProxyGenAssembly2,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null'的类型'ITestRestrictedInterfaceProxy83ad369cdf41472c857f61561d434436'上的方法'TestMethod'试图隐式地实现具有较弱类型参数约束的接口方法.

...但是,当我将此测试复制并粘贴到Rhino.Mocks.Tests项目中的fixture中时,不对引用的库进行任何更改,测试PASSES.我对下载的源进行了零更改.我对两侧的测试方法和相关接口/对象进行了ZERO更改.我构建了一个新的Rhino.Mocks DLL(没有IL合并Castle libs)并将它与Castle libs一起复制回我的生产解决方案,重新运行测试,它仍然失败并显示相同的消息.

WTF?

c# rhino-mocks castle-dynamicproxy rhino-commons

68
推荐指数
1
解决办法
2785
查看次数

如何清除对象的先前期望?

我想设置一个返回值

_stubRepository.Stub(Contains(null)).IgnoreArguments().Return(true);
Run Code Online (Sandbox Code Playgroud)

但是在特定测试中,覆盖该期望返回false.

就像是:

_stubRepository.ClearExpectations();  //<- this does not exist, I'm just making something up
_stubRepository.Stub(Contains(null)).IgnoreArguments().Return(false);
Run Code Online (Sandbox Code Playgroud)

注意,我不希望第二次调用时返回false,我想覆盖第一个期望.

这将有助于大大简化我的测试场景.

.net rhino-mocks

62
推荐指数
3
解决办法
1万
查看次数

使用AAA的Rhino Mocks AssertWasCalled(多次)在属性getter上

我有一个模拟对象作为构造函数参数传递给另一个对象.

如何测试已调用模拟对象的属性?这是我目前使用的代码:

INewContactAttributes newContact = MockRepository.GenerateMock<INewContactAttributes>();
newContact.Stub(x => x.Forenames).Return("One Two Three");
someobject.ConsumeContact(newContact);
newContact.AssertWasCalled(x => { var dummy = x.Forenames; });
Run Code Online (Sandbox Code Playgroud)

这有效,除非在"someobject"中,Forenames属性的getter被多次使用.那时我得到"Rhino.Mocks.Exceptions.ExpectationViolationException:INewContactAttributes.get_Forenames();期望#1,实际#2 .."

简单地使用

newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.Any());
Run Code Online (Sandbox Code Playgroud)

不起作用,并给出以下错误:

"期望已从等待期望列表中删除,您是否调用了Repeat.Any()?AssertWasCalled()不支持这种情况."

那么我该如何迎合多次通话呢?

c# getter unit-testing rhino-mocks properties

51
推荐指数
2
解决办法
2万
查看次数

使用Rhino.Mocks模拟静态方法

是否可以使用Rhino.Mocks模拟静态方法?如果Rhino不支持这个,是否有一种模式或某种东西可以让我做到这一点?

c# tdd rhino-mocks mocking

46
推荐指数
3
解决办法
3万
查看次数

.Net中的版本和"运行时版本"有什么区别?

当我在Visual Studio中的项目中打开其中一个引用的dll的属性窗口时,我看到了一个Version和一个运行时版本.

实际上是我正在检查的Rhino.Mocks库.我明白了

  • 运行时版本:v2.0.50727
  • 版本:3.6.0.0

有什么不同?(这是否意味着我无法使用3.6.0.0的Rhino Mocks?)

.net rhino-mocks runtime version .net-assembly

46
推荐指数
1
解决办法
2万
查看次数

Moq和Rhino.mocks有什么功能?

我找不到Moq和Rhino的特定功能比较.所有的问题都是"你更喜欢哪些以及为什么",或者"这里是你如何在犀牛中进行简单的模拟以及如何在moq中完成".

我无法在任何地方找到深刻的比较.我知道语法上的差异,我不是在寻找答案. 我正在寻找能力比较.例如:

  • Rhino有Expect.On()用于线程模拟.Moq可以这样做吗?

  • 那么多模拟(用一个模拟实现多个接口).Moq可以这样做吗?

  • 我相信Moq现在可以模拟受保护的成员.犀牛可以这样做吗?

编辑:我最后还看了一些其他.Net框架.

rhino-mocks moq typemock mocking nmock2

44
推荐指数
1
解决办法
5797
查看次数