tehdoommarine
tehdoommarine

Reputation: 2068

Setting Up MOQ Update Test

I am developing Moq tests for various entities. I can setup create and delete tests fine, but not update - the entity in the repository does not change. I know this is due to the PersistAll doing nothing (probably due to a setup I am missing).

This is a sample of an insert persist setup (I am looking for an Update version):

agg.Setup(a => a.InsertOnPersist<Thingy>(model)).Callback(() => mockThingies.Add(model));

In addition, I also have this to link the List to being the repository:

agg.Setup(a => a.GetObjectStore<Artist>()).Returns(mockThingies.AsQueryable());

This is a sample of an update test I have:

 public List<Thingy> mockThingies; //this is our repository
 [TestInitialize]
 public void SetupTests()
 {
    mockThingies= new List<Thingy>();
    Thingy someThingy = new Thingy();
    someThingy.Name = "MyName";
    someThingy.ID = 1;
    mockThingies.Add(someThingy);
  }

    [TestMethod]
    public void CanEditExistingThingy()
    {
        Mock<BusinessExceptionBroadcaster> beb = new Mock<BusinessExceptionBroadcaster>();
        Mock<IValidationEngine> valid = new Mock<IValidationEngine>();
        Mock<IAggregate> agg = new Mock<IAggregate>();
        agg.Setup(a => a.GetObjectStore<Thingy>()).Returns(mockThingies.AsQueryable());
        ThingyRepository repo = new ThingyRepository (agg.Object);
        ThingyService service = new ThingyService (repo, beb.Object, valid.Object);
        Thingy newThingy = new Thingy();
        newThingy.ID = 1; //same as old
        newThingy.Name = "newname"; //new name
        Assert.AreNotEqual(newThingy.Name,mockThingies[0].Name); 
        Assert.IsTrue(service.Update(newThingy));
        Assert.AreEqual(newThingy.Name, mockThingies[0].Name); //FAILS HERE
    }

This is the code to update:

    public bool Update(Thingy entity)
    {  
            Thingy existingThingy= _Thingy.FirstOrDefault(t=>t.ID == entity.ID);
            if (existingThingy != null)
            {
                _Thingy.PersistAll();
                return true;
            }
            else
            {
               //unimportant
            }
        }
        return false;
    }

Upvotes: 2

Views: 1153

Answers (2)

Kyle Trauberman
Kyle Trauberman

Reputation: 25684

Don't worry about testing whether the update call actually updates something. You'll just want to verify that your service calls the appropriate method on the repo to perform the update and persist. Testing the actual update is a little outside the scope of this one test.

Upvotes: 2

Sergei Rogovtcev
Sergei Rogovtcev

Reputation: 5832

As far as I can see, it can't work, because you're setting one Thingy with ID=1 in Setup, and then create other one with same ID in test. Although they share same ID, they are not same, so your changes can't be ever propagated to repository.

In fact, I think that it's a bug in your CUT code, because while you're testing ID match, you don't test that your repository knows something about entity you're updating. To add, I personally think that there's something wrong with your repository design if it allows such things.

If we were talking about EntityFramework I'd say you have to attach your entity to context.

Upvotes: 2

Related Questions