5

I am trying to use Nspec. I have followed these instructions: http://nspec.org/

  1. Create a class library project
  2. Nuget: Install-Package nspec
  3. Nuget: Install-Package FluentAssertions
  4. Create a class file and paste the following code:

using NSpec;
using FluentAssertions;

class my_first_spec : nspec
{
    string name;

    void before_each()
    {
        name = "NSpec";
    }

    void it_asserts_at_the_method_level()
    {
        name.ShouldBeEquivalentTo("NSpec");
    }

    void describe_nesting()
    {
        before = () => name += " Add Some Other Stuff";

        it["asserts in a method"] = () =>
        {
            name.ShouldBeEquivalentTo("NSpec Add Some Other Stuff");
        };

        context["more nesting"] = () =>
        {
            before = () => name += ", And Even More";

            it["also asserts in a lambda"] = () =>
            {
                name.ShouldBeEquivalentTo("NSpec Add Some Other Stuff, And Even More");
            };
        };
    }
}

The editor recognises the namespaces and the nspec class, however I see a compiler error that says:

'string does not contain a definition for ShouldBeEquivalentTo'.

What is the problem?

I am using .NET 4.7.1 and Visual Studio 2017.

I have spent some time Googling this and I have looked here for example: https://github.com/fluentassertions/fluentassertions/issues/234

Nkosi
  • 235,767
  • 35
  • 427
  • 472
w0051977
  • 15,099
  • 32
  • 152
  • 329

1 Answers1

17

FluentAssertions has removed ShouldBeEquivalentTo extension as a breaking change in more recent versions.

Refer to the recent FluentAssertions documentation for the suggested alternative

https://fluentassertions.com/introduction

name.Should().BeEquivalentTo(...);

Your example code would need to be updated to

class my_first_spec : nspec {
    string name;

    void before_each() {
        name = "NSpec";
    }

    void it_asserts_at_the_method_level() {
        name.Should().BeEquivalentTo("NSpec");
    }

    void describe_nesting() {
        before = () => name += " Add Some Other Stuff";

        it["asserts in a method"] = () => {
            name.Should().BeEquivalentTo("NSpec Add Some Other Stuff");
        };

        context["more nesting"] = () => {
            before = () => name += ", And Even More";

            it["also asserts in a lambda"] = () => {
                name.Should().BeEquivalentTo("NSpec Add Some Other Stuff, And Even More");
            };
        };
    }
}
Nkosi
  • 235,767
  • 35
  • 427
  • 472
  • Thanks. That works as expected. Would you put your Nspec tests in a separate Visual Studio project to your Specflow scenarios? – w0051977 Mar 06 '18 at 14:04
  • can you answer the question in my comment above? Then I will mark your answer. – w0051977 Mar 06 '18 at 15:53
  • 3
    @w0051977: That's not how stack overflow works! If you have another question, post a new one. This is not a forum, tutoring or discussion site. If the answer solved your original question, accept it. Please take the mandatory [tour] again to recap site-rules. – too honest for this site Mar 06 '18 at 16:04
  • Ahh... this works for Strings but doesn't seem to work for Int's. Seems Ints is `.Should().Be(...)` – WernerCD May 01 '18 at 20:12
  • @Nkosi - I was using `ShouldBeEquivalentTo` to compare lists of custom types, it was nicely comparing object public properties, wondering if you could suggest how to do this when ShouldBeEquivalentTo is not availablle anymore? – sll May 16 '18 at 12:44
  • @sll `.Should().BeEquivalentTo` should (*pardon the pun*) work for your assertions as well. – Nkosi May 16 '18 at 12:48