标签: moq

使用moq模拟虚拟只读属性

我找不到办法做到这一点,虽然这可以手工完成,所以为什么不用moq?

tdd unit-testing moq mocking

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

如何使用mock为不同的参数设置两次方法

我想用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()如果用户名或密码而不是上面的usernamepassword变量.为此,我添加了另一个设置,但这次它会覆盖上面的设置并始终应用它:

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)

.net c# unit-testing moq

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

在Moq中模拟泛型方法而不指定T.

我有一个方法的接口如下:

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)

被测对象的某些方法可能会调用三种或四种不同类型的保留.如果我必须设置所有类型,我必须为每个测试编写大量的设置代码.但是在单个测试中,我并不关心所有这些,我只需要非空的模拟对象,除了我实际测试的那个(我很乐意写一个更复杂的设置).

.net c# generics moq mocking

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

如何使用moq模拟Controller.User

我有几个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.任何的想法?

c# asp.net-mvc unit-testing moq mocking

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

使用moq模拟静态属性

我很擅长使用moq.我正在创建一些单元测试用例HttpModule,一切正常,直到我点击static属性如下

this.applicationPath = (HttpRuntime.AppDomainAppVirtualPath.Length > 1) ? HttpRuntime.AppDomainAppVirtualPath : String.Empty;
Run Code Online (Sandbox Code Playgroud)

我不知道如何为static类和属性创建模拟HttpRuntime.AppDomainAppVirtualPath.的context,requestresponse已与示例代码我从起订量得到很好嘲笑.如果有人可以帮助我,我将不胜感激.

c# asp.net unit-testing moq

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

什么是AutoFixture AutoMoq?

当我注意到AutoFixture AutoMoq时,我正在寻找nuget并想要导入moq.我看到AutoFixture是为了帮助更快地编写TDD,但我找不到AutoMoq的任何示例以及它与AutoFixture的不同之处.

有人能指出我这个AutoMoq所以我可以看到它在做什么.

moq autofixture

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

Moq - 需要模拟函数来返回传入的值

我有一个模拟,我已经设置这样.我需要返回传入的相同值.CreatePersonName

mock.Setup(m => m.CreatePersonName(It.IsAny<PersonName>()))
            .Returns(// what do i put here?);
Run Code Online (Sandbox Code Playgroud)

moq mocking

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

Moq使用参数返回Async()

我正在尝试模拟存储库的方法

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)

我按小时搜索,没有找到任何问题的答案.

有线索吗?

c# unit-testing moq

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

Moq如何替换过时的表达方式

我在我的代码中使用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.

linq moq

39
推荐指数
1
解决办法
4621
查看次数

Moq假一种方法但使用另一种方法的真实实现

给定一个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)

.net c# nunit unit-testing moq

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

标签 统计

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