标签: moq

ASP.NET MVC单元测试 - 会话

搜索了StackOverflow和谷歌我认为我正在做的事情是正确的,但结果似乎并不顺利

    [TestMethod]
    public void LoginAction_Should_Return_View_and_User_Authenticated()
    {
        // Arrange
        var mock = new Mock<ControllerContext>();
        var mockSession = new Mock<HttpSessionStateBase>();
        mock.Setup(p => p.HttpContext.Session).Returns(mockSession.Object);

        var testData = FakeUserData.CreateTestUsers();
        var repository = new FakeUserRepository(testData);
        var controller = new AccountController(repository);
        controller.ControllerContext = mock.Object;

        // Act
        var result = controller.Login("testuser1", "testuser1");

        // Assert
        Assert.AreEqual("testuser1", controller.HttpContext.Session["Username"]);
        Assert.IsTrue((bool)controller.HttpContext.Session["IsAuthenticated"]);
        Assert.IsInstanceOfType(result, typeof(RedirectToRouteResult));
    }
Run Code Online (Sandbox Code Playgroud)

当我运行测试时,controller.HttpContext.Session ["Username"]的值为null,但是我使用Session帮助器将值设置为用户名.我做错了什么,还是其他什么?任何帮助将不胜感激.

asp.net-mvc unit-testing moq session-variables

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

使用Moq在C#中设置索引器

我无法弄清楚如何使用Moq在C#中设置索引器.Moq文档很薄弱,我已经做了很多搜索......我想做的事情在如何设置索引属性的解决方案中类似:

var someClass = new Mock<ISomeClass>();
someClass.SetupSet(o => o.SomeIndexedProperty[3] = 25);
Run Code Online (Sandbox Code Playgroud)

我想修改上面的内容以适用于任何索引和任何值,所以我可以这样做:

someClass.Object.SomeIndexedProperty[1] = 5;
Run Code Online (Sandbox Code Playgroud)

目前我有以下内容,它对索引属性getter非常有用,但是如果我设置了值,Moq会忽略它:

var someValues = new int[] { 10, 20, 30, 40 };
var someClass = new Mock<ISomeClass>();
someClass.Setup(o => o.SomeIndexedProperty[It.IsAny<int>()])
    .Returns<int>(index => someValues[index]);

// Moq doesn't set the value below, so the Assert fails!
someClass.Object.SomeIndexedProperty[3] = 25;
Assert.AreEqual(25, someClass.Object.SomeIndexedProperty[3]);
Run Code Online (Sandbox Code Playgroud)

c# unit-testing indexer moq

19
推荐指数
2
解决办法
5963
查看次数

需要一些建议来尝试模拟.NET WebClient或等效的

我有一些代码可以下载一些RSS源.

我一直在使用WebClientArgotic.Syndication.RssFeed库.

但这些都不可模糊:(

我绝对不希望每次运行单元测试时都能看到真正的RSS提要.

有没有人对我能做什么有任何建议?

我需要创建一个邪恶的包装器吗?如果是这样..对此有何建议?

.net c# webclient moq mocking

19
推荐指数
2
解决办法
8038
查看次数

异步方法返回null

如果我尝试模拟包含如下async方法的类型:

interface Foo
{
    Task<int> Bar();
}
Run Code Online (Sandbox Code Playgroud)

然后mock的Bar方法返回null.我猜Moq正在选择default(Task<int>)我的方法的默认返回值,这确实是null.然而,Moq应该选择像Task.FromResult(default(int))默认值这样的东西.我可以强制Moq使异步方法返回非空任务吗?

c# moq mocking async-await

19
推荐指数
2
解决办法
9201
查看次数

检查属性是否已设置 - 使用Moq

我是Moq的新手,一般都在测试,所以这是我的noobish Q.如何测试请求中Status属性是否已使用Moq设置?

public class DudeManager
{
        private readonly IDRepository _repo;

        public DManager(IDRepository repo)
        {
            _repo = repo;
        }

        public void Create(Request r)
        {
            r.Status = Status.Submitted;
            _repo.AddRequest(r);
        }
}
Run Code Online (Sandbox Code Playgroud)

有没有比以下更好的方法?也许使用VerifySet?

        [TestMethod]
        public void AddingNewRequestSetsStatusToSubmitted()
        {
            //Arrange
            var mock = new Mock<IDRepository>();
            var mockRequest = new Mock<Request>();
            var dManager = new DManager(mock.Object);

            //Act
            dManager.Create(mockRequest.Object);

            //Assert
            Assert.AreEqual(Status.Submitted, mockRequest.Object.Status);
        }
Run Code Online (Sandbox Code Playgroud)

编辑:这是我在所有有用的建议后最终使用的方法:

//Arrange
var request = new Request();
var mock = new Mock<IDRepository>();
var dManager = new DManager(mock.Object);
mock.Setup(x …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing moq mocking

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

如何在Moq实体框架中调用SqlQuery

我已经能够DbSet使用此链接模拟来自Moq的实体框架.

但是,我现在想知道如何模拟对SqlQuery的调用.不确定这是否可行或者如何依赖于模拟的db上下文知道正在调用什么"查询".

以下是我想要嘲笑的内容.

var myObjects = DbContext.Database
    .SqlQuery<MyObject>("exec [dbo].[my_sproc] {0}", "some_value")
    .ToList();
Run Code Online (Sandbox Code Playgroud)

我目前还没有尝试任何东西,因为不知道如何开始嘲笑这个例子.

的嘲讽DbSet是下方再次重申,我可以正确模拟返回DbSetMyObject的,但现在我试图嘲弄返回列表SQLQuery对MyObject的.

var dbContext = new Mock<MyDbContext>();
dbContext.Setup(m => m.MyObjects).Returns(mockObjects.Object);

dbContext.Setup(m => m.Database.SqlQuery... something along these lines
Run Code Online (Sandbox Code Playgroud)

c# entity-framework moq dbcontext

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

在VS15中使用Moq进行单元测试时,returnsasync(null)会产生构建错误

当我ReturnsAsync(null)在Visual Studio(with Moq)中使用C#单元测试方法时,我收到错误:

"以下方法或属性之间的调用不明确"

然后是ReturnsAsync具有不同参数的方法列表.我知道这是由于ReturnsAsync函数被重载.但是,当我在同事的计算机上运行相同的单元测试时,它运行没有任何错误.有谁知道为什么会这样?有谁知道如何解决这一问题?

此外,当我建立时,我收到警告:

所有引用********的软件包都必须安装nuget软件包Microsoft.Bcl.Build.

这会有什么影响吗?

c# unit-testing asynchronous moq

19
推荐指数
2
解决办法
5086
查看次数

嘲弄通用方法

假设我有一些通用方法的接口,没有参数:

public interface Interface {
   void Method<T>();
}
Run Code Online (Sandbox Code Playgroud)

现在我希望实现这个类的模拟(我正在使用Moq),我希望模拟这个方法的一些具体类型 - 让我说我在嘲笑Method<String>()调用.

mock = new Mock<Interface>();
mock.Setup(x => x.Method ????).Returns(String("abc"));
Run Code Online (Sandbox Code Playgroud)

的想法????应该是明确的-这lambda表达式应该处理的情况时,TMethod<T>实际上是一个String.

有什么方法可以达到想要的行为吗?

.net c# generics moq

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

如何断言是否使用nunit调用了一个方法

是否可以断言是否已调用方法?我正在测试以下方法,我想声明_tokenManager.GetToken()已被调用.我只是想知道方法是否已被调用,因为该方法不返回值.我正在使用Moq.

谢谢,

代码段

public void Subscribe(string code, string emailAddress, string columnKey)
{
    // Request authentication token
    var token = _tokenManager.GetToken(code, false);

    if (!_tokenValidator.Validate(token))
    {
        // Token has expired or invalid - refresh the token 
        token = _tokenManager.GetToken(code, true);
    }

    // Subscribe email
    _silverpopRepository.Subscribe(token.AccessToken, emailAddress, columnKey);
}
Run Code Online (Sandbox Code Playgroud)

c# nunit moq

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

模拟AsNoTracking实体框架

我如何模拟AsNoTracking方法?
在下面的示例中,DbContext已注入服务类.如果我从GetOrderedProducts方法中删除AsNoTracking扩展方法,但是AsNoTracking测试失败,因为它返回null,它工作正常.我也尝试过模拟AsNoTracking以返回正确的值,但它没有用.

public interface IUnitOfWork
{
    IDbSet<TEntity> Set<TEntity>() where TEntity : class;
    int SaveAllChanges();
}

public class Entites : DbContext, IUnitOfWork
{
    public virtual DbSet<Product> Products { get; set; }  // This is virtual because Moq needs to override the behaviour

    public new virtual IDbSet<TEntity> Set<TEntity>() where TEntity : class   // This is virtual because Moq needs to override the behaviour 
    {
        return base.Set<TEntity>();
    }

    public int SaveAllChanges()
    {
        return base.SaveChanges();
    }
}

    public class ProductService
{
    private readonly IDbSet<Product> …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing entity-framework moq mocking

18
推荐指数
2
解决办法
6367
查看次数