标签: moq

我这次与Moq做错了什么?

我再次遇到moq的问题而且不确定这次我做错了什么.

所以我一步一步地通过调试器,我注意到即使在我的模拟中我也设置了

ResetPassword返回"嘿它似乎没有

这是我的单元测试的一部分:

var membershipMock = new Mock<MembershipProvider>();



           var user = new Mock<MembershipUser>();

           user.SetupGet(x => x.Email).Returns("Email");
           user.Setup(x => x.ResetPassword("test")).Returns("hey");

           membershipMock.Setup(m => m.GetUser("chobo2", false)).Returns(user.Object);



           authentication.Authenticate.Provider = membershipMock.Object;

           // Act

           var actual = authentication.PasswordRecoveryStep2("chobo2","2z");
Run Code Online (Sandbox Code Playgroud)

我的代码

  MembershipUser userName = Provider.GetUser(user, false);

                string newPassword = userName.ResetPassword(securityAnswer);

 Mail.To = userName.Email;
Run Code Online (Sandbox Code Playgroud)

Provider是一个使用模型对象设置的属性,如您所见.电子邮件部分填写正常.只是ResetPassword不会返回它应该的内容.它只是给我null.

谢谢

c# unit-testing moq mocking

0
推荐指数
1
解决办法
2373
查看次数

使用Moq验证方法是否被调用

我有一个类:

public class Store
{
  public Store()
  {
     Products = new List<Product>();
  }
  public IList<Product> Products {get; private set;}
  public void AddProduct(int id, string productCode)
  {
     Product p = new Product();
     p.Id = id;
     p.ProductCode = productCode;            
     //Validate before adding
     Products.Add(p);  //How can i verify that this was called
  }
}
Run Code Online (Sandbox Code Playgroud)

使用Moq如何验证是否已调用Products List的Add方法?有人能提供一个简单的例子吗?

moq

0
推荐指数
1
解决办法
964
查看次数

Moq在C#中设置混乱

所以我有以下课程:

public class MyClass {
  internal void A() {
    foreach(Thing thing in ThingArray)
      B(thing);
  }

  virtual internal void B(Thing thing)
  {
    //  do some stuff
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我有以下测试:

...
var testObject = new Mock<MyClass>(parameters);
testObject.Setup(t => t.B(It.IsAny<Thing>()));

test.Object.A();

test.Verify(t => t.B(It.IsAny<Thing>()), Times.Exactly(2));
Run Code Online (Sandbox Code Playgroud)

验证失败了.我已经检查过,代码调用真正的 B()方法而不是模拟的B()方法.

我有很多代码在Moq完美运行的地方运行,我编码的时间足够长,以至于我必须在这里做错事,但对于我的生活,我看不到它.我一直在假设自从我打电话测试.对象 .A(),对B()的调用不是通过模拟,但这对我来说没有任何意义,因为来自任何其他对象的调用将起作用相同...

那么为什么在地球上不是被执行的模拟设置呢?

编辑:是的,我有测试项目可见的内部.我打算把它放到原帖中,因为我知道有人会提到它.

至于真正的代码,遗憾的是非常专有,所以我不能发布它.我会看看明天是否可以调整代码以使其实际编译.

c# moq

0
推荐指数
1
解决办法
3709
查看次数

模拟 - 在调用构造函数之前设置属性

在RhinoMocks或Moq中,可以在调用构造函数之前设置对象的属性吗?

我正在尝试测试一种方法.

包含该方法的类在其构造函数中有一些代码依赖于某些成员被设置,遗憾的是构造函数中没有用于设置它们的参数,因此我必须通过属性设置它们.有没有办法在RhinoMocks或Moq中调用构造函数之前设置此属性?

javascript unit-testing rhino-mocks moq mocking

0
推荐指数
1
解决办法
458
查看次数

ControllerContext.IsChildAction调用失败,模拟行为为Strict.所有调用都必须有一个设置

我正在四处学习如何对ASP.NET MVC控制器操作进行单元测试.具体来说,我正在尝试模拟ControllerContext,以便我可以测试访问HttpContext.Current.User.Identity.Name的操作.

我正在使用Moq.

在我打开MockBehavior.Strict之前,事情进展顺利.我知道如果代码无法调用我标记为Verifiable的东西,这会抛出异常.显然,如果我没有提供设置(如IsChildAction)的"额外"方法不被调用,它也会抛出异常.

[TestMethod]

public void Index_Get_AccessesUserIdentityName()
    {

// Arrange

var mock = new Mock<ControllerContext>(MockBehavior.Strict);

mock.SetupGet(p => p.HttpContext.User.Identity.Name).Returns("treycarroll").Verifiable();
HomeController controller = new HomeController();
controller.ControllerContext = mock.Object;

// Act
ViewResult result = controller.Index() as ViewResult;

// Assert
mock.Verify();
...
}
Run Code Online (Sandbox Code Playgroud)

这是我正在测试的Controller操作:

public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!"+User.Identity.Name;

        return View();
    }
Run Code Online (Sandbox Code Playgroud)

返回View()时触发异常; 声明被执行.错误消息告诉我,我需要一个调用IsChildAction的设置方法,所以我将我的测试类更新为:

[TestMethod] 

    public void Index_Get_AccessesUserIdentityName() 
    { 

        // Arrange 

        var mock = new Mock<ControllerContext>(MockBehavior.Strict); 

        string expectedUserName = "treycarroll";

        mock.SetupGet(p => p.HttpContext.User.Identity.Name).Returns(expectedUserName).Verifiable();
        mock.SetupGet(m => m.IsChildAction).Returns(true).Verifiable();
        HomeController controller …
Run Code Online (Sandbox Code Playgroud)

moq mocking asp.net-mvc-2

0
推荐指数
1
解决办法
2620
查看次数

我怎样才能模拟Server.HtmlEncode - 返回null引用

我正在尝试模拟Server.HtmlEncode(),但我一直有一个空引用异常.我是Moq框架的新手,这是我的代码:

var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
var response = new Mock<HttpResponseBase>();
var session = new Mock<HttpSessionStateBase>();
var server = new Mock<HttpServerUtilityBase>();

server.Setup(svr => svr.HtmlEncode(It.IsAny<string>())).Returns((string s) => s);
context.Setup(ctx => ctx.Request).Returns(request.Object);
context.Setup(ctx => ctx.Response).Returns(response.Object);
context.Setup(ctx => ctx.Session).Returns(session.Object);
context.Setup(ctx => ctx.Server).Returns(server.Object);
Run Code Online (Sandbox Code Playgroud)

我也尝试过以下方法:

context.Setup(ctx => ctx.Server.HtmlEncode(It.IsAny<string>())).Returns((string s) => s);
Run Code Online (Sandbox Code Playgroud)

我找到了一个解决方案,但它似乎是一个过时的解决方案,因为期望被设置取代.

谢谢,Arne

asp.net testing asp.net-mvc moq

0
推荐指数
1
解决办法
1690
查看次数

模拟统一容器时的异常

我试图模拟一个统一容器 - 我使用Moq并得到这个错误

System.ArgumentException: Invalid setup on a non-overridable member:
c => c.Resolve<ILogisticsAdapter>(new [] {})
Run Code Online (Sandbox Code Playgroud)

这是我测试的设置部分的代码.

 var mockContainer = new Mock<IUnityContainer>();
      mockContainer.Setup(c => c.Resolve<ILogisticsAdapter>()).Returns(logicsticsAdapter);
      IUnityContainer container = mockContainer.Object;
Run Code Online (Sandbox Code Playgroud)

我错过了什么?我不是一般的模拟或单元测试的主人,但从我能说的这应该工作......

以防万一我使用VS2010和MS测试...

谢谢

这是整个测试夹具 - 你可以看到我已经改变它以使用真正的统一容器,但理想情况下我不想创建一个真正的统一容器 - 它不是我正在测试的.但是你可以看到我注释掉的代码......

 [TestMethod]
public void WhenContructed_AdapterGetsSet()
{
  //Prepare
  ILogisticsAdapter logicsticsAdapter = new Mock<ILogisticsAdapter>().Object;
  var mockEventAggregator = new Mock<IEventAggregator>();
  mockEventAggregator.Setup(x => x.GetEvent<SetHelpMessageEvent>()).Returns(new SetHelpMessageEvent());
  IEventAggregator eventAggregator = mockEventAggregator.Object;
  IRegionManager regionManager = new Mock<IRegionManager>().Object;

  //var mockContainer = new Mock<IUnityContainer>();
  //mockContainer.Setup(c => c.Resolve<ILogisticsAdapter>(null)).Returns(logicsticsAdapter);
  //IUnityContainer container = mockContainer.Object;
  IUnityContainer container = …
Run Code Online (Sandbox Code Playgroud)

c# mstest moq unity-container

0
推荐指数
1
解决办法
2182
查看次数

模拟对象无法返回所需的对象

肯定会有一些我忽视的东西 - 通常是我遇到这样的问题.

我有一个控制器只是根据提供的ID返回一篇新闻文章:

[HandleError]
public class HomeController : Controller
{
    private readonly IArticleRepository articleRepository;

    public HomeController(IArticleRepository Repository)
    {
        articleRepository = Repository;
    }

    public ActionResult Index()
    {
        return View("Index");
    }

    // Here's the bit we're interested in
    public ActionResult Article(int id)
    {
        var article = articleRepository.GetById(id);

        return View("Article", article);
    }

}
Run Code Online (Sandbox Code Playgroud)

我正在使用Moq嘲笑这个:

[TestFixture]
public class HomeControllerTests
{
    HomeController controller;
    int articleId;
    Article model;

    [TestFixtureSetUp]
    public void SetupMethods()
    {
        Mock<IArticleRepository> repositoryMock = new Mock<IArticleRepository>();
        repositoryMock.Setup(x => x.GetById(articleId)).Returns(GetSampleArticle());

        controller = new HomeController(repositoryMock.Object); …
Run Code Online (Sandbox Code Playgroud)

c# nunit moq ninject-2 asp.net-mvc-3

0
推荐指数
1
解决办法
1300
查看次数

使用moq时包含的问题

我想测试一个删除方法.删除方法在模拟服务中调用(不用moq模拟).

该服务管理对象列表.对象的类派生自覆盖equals()的基类.

 public override bool Equals(object obj) {
        if (obj == null || GetType() != obj.GetType()) {
            return false;
        }

        BaseClass testObj = (BaseClass)obj;
        return BusinessId.Equals(testObj.BusinessId);

    }
Run Code Online (Sandbox Code Playgroud)

我打电话的时候

 serive.GetAll().Contains(objectInList);
Run Code Online (Sandbox Code Playgroud)

我弄错了.

不调用基类中的Equals方法.列表中的对象使用moq进行模拟.

 Mock<TypeOfObject> objectMock = new Mock<TypeOfObject>();
 objectMock.SetupGet(pf => pf.BusinessId).Returns(guid);
 return objectMock.Object;
Run Code Online (Sandbox Code Playgroud)

我如何设置模拟调用基类的Equals-Methode并且Contains-method返回true?

提前致谢.

c# moq contains equals

0
推荐指数
1
解决办法
988
查看次数

为什么界面上缺少Moq设置方法?

我有以下代码,它将接口传递给一个需要协议处理程序的字典列表的函数:

 var _protocolHandlers = new Dictionary<EmailAccountType, IEmailTransportHandler>
                        {
                            {EmailAccountType.Pop3, new Mock<IEmailTransportHandler>().Object},
                            {EmailAccountType.IMAP, new Mock<IEmailTransportHandler>().Object}
                        };
Run Code Online (Sandbox Code Playgroud)

但奇怪的是,下面的代码没有给我模拟对象的设置方法:

_protocolHandlers[0].<where are set-up methods??>
Run Code Online (Sandbox Code Playgroud)

它似乎遵循约定,将普通接口传递给服务的构造函数,因为它们接受接口,但它们是使用.Object()注入的.

有谁知道这里发生了什么?

c# dependency-injection moq

0
推荐指数
1
解决办法
1136
查看次数