我再次遇到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.
谢谢
我有一个类:
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方法?有人能提供一个简单的例子吗?
所以我有以下课程:
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()的调用不是通过模拟,但这对我来说没有任何意义,因为来自任何其他对象的调用将起作用相同...
那么为什么在地球上不是被执行的模拟设置呢?
编辑:是的,我有测试项目可见的内部.我打算把它放到原帖中,因为我知道有人会提到它.
至于真正的代码,遗憾的是非常专有,所以我不能发布它.我会看看明天是否可以调整代码以使其实际编译.
在RhinoMocks或Moq中,可以在调用构造函数之前设置对象的属性吗?
我正在尝试测试一种方法.
包含该方法的类在其构造函数中有一些代码依赖于某些成员被设置,遗憾的是构造函数中没有用于设置它们的参数,因此我必须通过属性设置它们.有没有办法在RhinoMocks或Moq中调用构造函数之前设置此属性?
我正在四处学习如何对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) 我正在尝试模拟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
我试图模拟一个统一容器 - 我使用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) 肯定会有一些我忽视的东西 - 通常是我遇到这样的问题.
我有一个控制器只是根据提供的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) 我想测试一个删除方法.删除方法在模拟服务中调用(不用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?
提前致谢.
我有以下代码,它将接口传递给一个需要协议处理程序的字典列表的函数:
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()注入的.
有谁知道这里发生了什么?
moq ×10
c# ×6
mocking ×3
unit-testing ×2
asp.net ×1
asp.net-mvc ×1
contains ×1
equals ×1
javascript ×1
mstest ×1
ninject-2 ×1
nunit ×1
rhino-mocks ×1
testing ×1