我想用Moq设置一个方法两次,但似乎最后一个覆盖了之前的方法.这是我的初始设置:
string username = "foo";
string password = "bar";
var principal = new GenericPrincipal(
new GenericIdentity(username),
new[] { "Admin" });
var membershipServiceMock = new Mock<IMembershipService>();
membershipServiceMock.Setup(ms =>
ms.ValidateUser(username, password)
).Returns(new ValidUserContext {
Principal = principal
});
Run Code Online (Sandbox Code Playgroud)
这很好但我希望这返回new ValidUserContext()如果用户名或密码而不是上面的username和password变量.为此,我添加了另一个设置,但这次它会覆盖上面的设置并始终应用它:
membershipServiceMock.Setup(ms =>
ms.ValidateUser(It.IsAny<string>(), It.IsAny<string>())
).Returns(
new ValidUserContext()
);
Run Code Online (Sandbox Code Playgroud)
使用Moq处理此类情况的最优雅方式是什么?
编辑
我通过以下方法解决了问题,但我想有更好的方法来处理这个问题:
var membershipServiceMock = new Mock<IMembershipService>();
membershipServiceMock.Setup(ms =>
ms.ValidateUser(It.IsAny<string>(), It.IsAny<string>())
).Returns<string, string>((u, p) =>
(u == username && p == password) ?
new ValidUserContext {
Principal …Run Code Online (Sandbox Code Playgroud) 我有一个方法的接口如下:
public interface IRepo
{
IA<T> Reserve<T>();
}
Run Code Online (Sandbox Code Playgroud)
我想模拟包含此方法的类,而不必为它可用于的每种类型指定安装方法.理想情况下,我只是喜欢它返回一个new mock<T>.Object.
我该如何实现这一目标?
看来我的解释还不清楚.这是一个例子 - 当我指定T(这里是字符串)时,这是可能的:
[TestMethod]
public void ExampleTest()
{
var mock = new Mock<IRepo>();
mock.Setup(pa => pa.Reserve<string>()).Returns(new Mock<IA<string>>().Object);
}
Run Code Online (Sandbox Code Playgroud)
我想要实现的是这样的:
[TestMethod]
public void ExampleTest()
{
var mock = new Mock<IRepo>();
mock.Setup(pa => pa.Reserve<T>()).Returns(new Mock<IA<T>>().Object);
// of course T doesn't exist here. But I would like to specify all types
// without having to repeat the .Setup(...) line for each of them.
}
Run Code Online (Sandbox Code Playgroud)
被测对象的某些方法可能会调用三种或四种不同类型的保留.如果我必须设置所有类型,我必须为每个测试编写大量的设置代码.但是在单个测试中,我并不关心所有这些,我只需要非空的模拟对象,除了我实际测试的那个(我很乐意写一个更复杂的设置).
我有几个ActionMethods来查询Controller.User这样的角色
bool isAdmin = User.IsInRole("admin");
Run Code Online (Sandbox Code Playgroud)
在这种情况下方便地行事.
我开始用这样的代码对这些方法进行测试
[TestMethod]
public void HomeController_Index_Should_Return_Non_Null_ViewPage()
{
HomeController controller = new HomePostController();
ActionResult index = controller.Index();
Assert.IsNotNull(index);
}
Run Code Online (Sandbox Code Playgroud)
并且测试失败,因为未设置Controller.User.任何的想法?
我很擅长使用moq.我正在创建一些单元测试用例HttpModule,一切正常,直到我点击static属性如下
this.applicationPath = (HttpRuntime.AppDomainAppVirtualPath.Length > 1) ? HttpRuntime.AppDomainAppVirtualPath : String.Empty;
Run Code Online (Sandbox Code Playgroud)
我不知道如何为static类和属性创建模拟HttpRuntime.AppDomainAppVirtualPath.的context,request并response已与示例代码我从起订量得到很好嘲笑.如果有人可以帮助我,我将不胜感激.
当我注意到AutoFixture AutoMoq时,我正在寻找nuget并想要导入moq.我看到AutoFixture是为了帮助更快地编写TDD,但我找不到AutoMoq的任何示例以及它与AutoFixture的不同之处.
有人能指出我这个AutoMoq所以我可以看到它在做什么.
我有一个模拟,我已经设置这样.我需要返回传入的相同值.CreatePersonName
mock.Setup(m => m.CreatePersonName(It.IsAny<PersonName>()))
.Returns(// what do i put here?);
Run Code Online (Sandbox Code Playgroud) 我正在尝试模拟存储库的方法
public async Task<WhitelistItem> GetByTypeValue(WhitelistType type, string value)
Run Code Online (Sandbox Code Playgroud)
使用Moq ReturnsAsync,如下所示:
static List<WhitelistItem> whitelist = new List<WhitelistItem>();
var whitelistRepositoryMock = new Mock<IWhitelistRepository>();
whitelistRepositoryMock.Setup(w => w.GetByTypeValue(It.IsAny<WhitelistType>(), It.IsAny<string>()))
.ReturnsAsync((WhitelistType type, string value) =>
{
return (from item in whitelist
where item.Type == type && item.Value == value
select item).FirstOrDefault();
});
Run Code Online (Sandbox Code Playgroud)
但我在行中收到此错误"... ReturnsAsync((WhitelistType type ...):
无法将lambda表达式转换为类型'Model.WhitelistItem',因为它不是委托类型
WhitelistType是这样的枚举:
public enum WhitelistType
{
UserName,
PostalCode
}
Run Code Online (Sandbox Code Playgroud)
我按小时搜索,没有找到任何问题的答案.
有线索吗?
我在我的代码中使用Moq.我写了一个表达式:
mockInvoice.VerifySet(x => x.InvoiceAttachmentId, Times.Once());
Run Code Online (Sandbox Code Playgroud)
InvoiceAttachmentId我的发票上的财产在哪里.
它工作正常,但我得到警告:
Moq.MockExtensions.VerifySet(Moq.Mock,System.Linq.Expressions.Expression>,Moq.Times)'已过时:'由VerifySet替换(Action,Times)'
任何人都可以告诉我如何重写它以满足编译器并摆脱警告?我不确定如何替换Action.
给定一个IService具有Method1()和的接口Method2().
我想测试当Method1()抛出一个Exception,Method2()被调用并返回一个给定的值.
(投掷Method2()时被称为Method1()).
因此我需要Method2()用假的测试真实Method1(),它们是相同界面的方法.
这是我的测试代码:
MBase sut.MethodX()是唯一的切入点.它使用IService.
我的目标是断言Method2()返回一些东西.
// Arrange
// Fake bytes in.
var networkStreamMock = new Mock<INetworkStream>();
networkStreamMock.Method1(x => x.Read(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>())).Returns(It.IsAny<byte[]>());
// Force throw TimeoutException.
var mock = new Mock<IService>();
mock.Setup(x => x.Method1(new Message
{
Xml = Xml,
}
)).Throws<TimeoutException>();
// Check Method 2 is called. (this is …Run Code Online (Sandbox Code Playgroud) moq ×10
c# ×6
unit-testing ×6
mocking ×4
.net ×3
asp.net ×1
asp.net-mvc ×1
autofixture ×1
generics ×1
linq ×1
nunit ×1
tdd ×1