Sådan angives mennesker som et søgeområde / Udgangspunktet for indeksering ved hjælp af SharePoint 2013 REST API

Jeg havde grund til at arbejde med SharePoint 2013 Search API via resten for første gang. Jeg ønskede at søge efter personer, ikke dokumenter. Nøglen læring her er, at angiver du indholdskilder via sin GUID (eller i det mindste i dette tilfælde). Følgende jQuery kodestykke viser hvordan:

    loadExpertsAsync: funktion() {

        jQuery.support.cors = True;

        $.Ajax({
            URL-adresse: Dette.CreateFullApiUrl() +
                "?querytext = 'hjemmesider'&SourceId = 'b09a7990-05ea-4af9-81ef-edfab16c4e31'" +
                "&selectproperties ='LinkedInProfileUrl,GoogleCirclesProfileUrl,BALargeProfilePictureUrls,BAGridPictures,WorkEmail,Færdigheder,AboutMe,Interesser,Jobtitel,PastProjects,PictureURL,PreferredName,TwitterHandle,LinkedInProfileUrl,PreferredName,GoogleCirclesProfileUrl'" +
                "&ROWLIMIT = 99",
            metode: "FÅ",
            overskrifter: { "Acceptere": "ansøgning/json; OData = verbose" },
            cache: falsk,
            succes: funktion (resultat) {

I mit tilfælde, Jeg kører API mod SharePoint online. At få GUID'EN, Jeg har fulgt disse trin:

  1. Adgang til SharePoint administration
  2. Vælg "Søg" fra den venstre hånd navigation
  3. Vælg Administrer"resultatet kilder"
  4. Vælg "Lokale folk resultater"
  5. Kig på URL-adressen.

Min URL kiggede noget som:

https://xyzzy-admin.sharepoint.com/_layouts/15/searchadmin/EditResultSource.aspx?level=tenant&sourceid=b09a7990%2D05ea%2D4af9%2D81ef%2Dedfab16c4e31&view=1

Parameteren sourceid er hvad arbejdede nemlig mig.

(Jeg forstår at sourceid faktisk kan være en slags permanent ting med SP, men jeg vil altid tjekke alligevel 🙂 ).

</slutningen>

undefinedAbonner på min blog.

Følg mig på kvidre på http://www.twitter.com/pagalvin

Eksempel SharePoint resten opkald

Her er et sæt af prøven resten opkald, der arbejder for mig og kan hjælpe dig ud samt. Som af 02/2014, there are two examples 🙂

  1. Referere til en kolonne med mellemrum i navn
  2. Referere til en multi-Vælg kolonne
  3. Udføre en People Search via resten

 

Jeg vil tilføje, at som tiden går.

Her er nogle nyttige trykfarver, jeg har fundet, samt:

Referere til en kolonne med mellemrum i navn

Jeg oprette en brugerdefineret liste med en kolonne med navnet "Blog forfatter" (plads mellem Blog og forfatter).

$select til at henvise til denne kolonne er:

image

Du skal blot udskifte rummet med "_x0020_". Vi ser _x0020_ i mange eksempler på tværs af internets og resten er ikke anderledes.

Hvis du ikke gør det, du risikerer at få en fejlmeddelelse som denne:

Udtrykket “Blog forfatter” er ikke gyldigt.

Let nok.

Referere til en multi-Vælg opslagskolonne

Opsætning af:

  1. Oprette en brugerdefineret liste navngivne kategorier.
  2. Tilføj nogle kategorier. Jeg har tilføjet kategorier thusly:image
  3. Oprette et andet brugerdefineret liste kaldet MockBlog og føje kategorier som en multi-Vælg listekolonne (eller webstedskolonne hvis det er hvordan du rulle).

Tilføje nogle elementer på listen Mockblog og du er klar.

En Ajax stil opkald ved hjælp af jQuery vil se noget som dette:

serverUrl  = "/_api/web/lister/GetByTitle('MockBlog')/elementer" +
             "?$Vælg = Title,Kategorier/titel,Blog_x0020_Author/titel" + 
             "&$Udvid = Blog_x0020_Author,Kategorier";

Vi fortæller SharePoint "Giv mig titlen for alle kategorier (Kategorier/titel). Få de faktiske værdier for Titel ved $UdvidING listen kategorier." (Min afslappende omskrive er sandsynligvis temmelig løs, men dette hvordan jeg fortolke det).

Hvis du gør det via JavaScript og brug af Fiddler til at se på output, du får noget som dette til gengæld:

 

image

(Ovenstående er en JSON objekt)

Udføre en People Search via resten

Jeg blogges om dette særskilt. Centrale er at angive en sourceid parameter hvis værdi er GUID'EN for den lokale befolkning indholdskilde. (Indholdskilder plejede at blive kaldt dækningsområder og det er min-oh-my så svært ikke at kalde alt en mulighed for mig!).

Læs mere om det her: http://www.mstechblogs.com/paul/?p=10385

 

</slutningen>

undefinedAbonner på min blog.

Følg mig på kvidre på http://www.twitter.com/pagalvin

Hurtig og nem: Oprette et SharePoint-websted ved hjælp af resten

Der er en masse ressourcer omkring at vise hvordan man gør det, men jeg kunne ikke finde en omfattende gå til link, så her er vi.

Du kan oprette et SharePoint-websted ved hjælp af API'EN resten.  Her er en fuldt bagt eksempel:

<!--
    SiteRequestForm.html: Indsamle oplysninger og oprette et websted for brugeren.
-->

<Center>
<tabel>
    <Tr>
        <TD>Navn på websted:</TD>
        <TD><input type= "tekst" Navn= "SiteName" id= "SiteName" /></TD>
    </Tr>
    <Tr>
        <TD colspan= "2">
            <input type= "Send" id= "CreateSiteButton" værdi= "Opretter webstedet" />
        </TD>
    </Tr>
</tabel>
</Center>

<script src="../Plugins/jQuery-1.11.0.min.js"></script>

<script>
varians CreateSiteLogicContainer = {

    createSiteData: {
            "parametre": {
                __metadata: { "type": "SP.WebInfoCreationInformation" },
                URL-adresse: "Paultest1",
                Titel: "Paultest1",
                Beskrivelse: "resten-skabte web af Paul!",
                Sprog: 1033,
                Webstedsskabelonen: "sts",
                UseUniquePermissions: falsk
            }
    },

    createSite: funktion () {

        jQuery.support.cors = True;

        CreateSiteLogicContainer.createSiteData.parameters.Url = $("#SiteName").Val();
        
        $.Ajax({
            URL-adresse: "https://bigapplesharepoint.sharepoint.com/NBAIADev/_api/web/webinfos/add",
            metode: "POST",

            overskrifter: {
                "acceptere": "ansøgning/json; OData = verbose",
                "content-type": "ansøgning/json;OData = verbose",
                "X-RequestDigest": $("#__REQUESTDIGEST").Val()
            },

            data: JSON.stringify(CreateSiteLogicContainer.createSiteData),

            succes: funktion () { alarm("succes"); },
            fejl: funktion () { alarm("fejl"); }

        });
    },

    wireUpForm: funktion () {
        $("#CreateSiteButton").Klik på(funktion () {
            alarm("Ved at prøve og oprette webstedet.");
            CreateSiteLogicContainer.createSite();
        });
    }


}

CreateSiteLogicContainer.wireUpForm();

</script>

Når det lykkes, du får en JSON pakke som svar på denne:

image

Min centrale tanker og læringer fra denne omfatter:

  • Denne fremgangsmåde bruger jQuery.  I mit tilfælde, mit jQuery biblioteket er beliggende i ".../ plugins. "  Du vil gerne ændre det til at pege på din foretrukne JQ placering.
  • Du kan kopiere og indsætte det hele kodestykket i webdelen Indholdsredigering på en side og skal det fungere bare fint.  Du ønsker at ændre slutpunktet for API-kald og sørg for du reference JQ korrekt.
  • URL-adressen er i forhold til din API slutpunkt.  I mit tilfælde, Det er at oprette underordnede websteder under https://bigapplesharepoint.com
  • Du behøver ikke at give en indhold-længde. Nogle blogindlæg og MSDN dokument indebærer, at du gør, men der skete for mig automatisk, som jeg formoder bliver håndteret af $.ajax opkaldet, selv.
  • Denne linje er påkrævet for at undgå en "forbudte" svar: "X-RequestDigest": $("#__REQUESTDIGEST").Val().  Der er andre måder at gøre det, men det er ret nice.  Jeg har mistet linket til blog, leveres denne genvej.  H/T til dig, mystiske blogger!

Held og lykke og håber det hjælper nogen.

</slutningen>

undefinedAbonner på min blog.

Følg mig på kvidre på http://www.twitter.com/pagalvin

Overvinde irriterende Problem med Relative URL-adresser i SharePoint rask indlede

Jeg ønskede at tilføje et link til hurtig start navigation forleden og SharePoint fortalte mig:

image

Ren tekstversion af der er:

Sikre, at Webadressen er gyldig og begynder med enten et gyldigt tegn (et nummertegn (#) eller skråstreg (/)) eller en gyldig understøttet protokol (for eksempel, ' http://’, ' https://’, ' fil://’, ' ftp://’, ' mailto:’, «Nyheder:’).

"Blech og pox!"Jeg sagde.

En løsning til dette er at bruge JavaScript til at finde en kendt link i den rask indlede og tilsidesætte sin opførsel.

At teste dette, føje et nyt link til webstedet test thusly:

image

Jeg brugte jQuery. At løse det, få nogle JavaScript og jQuery til siden ved hjælp af din foretrukne teknik og med en linje kode på denne:

 

$(dokument).klar til( funktion () {

    $("en:indeholder("Test URL udskiftning")").Klik på(funktion () { alarm("ændrede Klik adfærd!"); tilbagevenden falsk;});

});

Og Bob er din onkel.

JQuery selector finder hver <en> Tag, der har "Test URL udskiftning" i sit navn. Du kan finde-tune, afhængigt af din link og sådan.

Af .click(funktion() tilsidesætter uanset SharePoint ville have gjort, når brugeren klikker på. Sørg for, at du "returnerer false" eller andet, det vil gøre dit kram og derefter prøve at href ting også, der er næsten helt sikkert ikke dit mål.

Dette blev gjort og test i et SharePoint online miljø men bør arbejde godt i 2010 og tidligere for.

</slutningen>

undefinedAbonner på min blog.

Følg mig på kvidre på http://www.twitter.com/pagalvin

Hurtig og enkel: SharePoint resten kalder kun returnerer 100 Poster

Jeg har arbejdet på et offentligt modstående websted for min SharePoint praksis her i New York og det bruger en masse JavaScript og resten opkald til at vise indhold.

Under hovedlinjen udvikling, Jeg oprette en lille datasæt med lige 10 eller så rækker i en brugerdefineret liste og min resten opfordrer alle trak derfra.  En gang jeg stødte op på listen for at have et par hundrede rækker af data til at teste for forventede vækst, Jeg fandt, at jeg fik præcis 100 rækker, der returneres tilbage på min hvile opkald.

Dette er en meget simpel ting at adresse.  I mit tilfælde (og jeg tror i de fleste tilfælde), standard resten opkald til SharePoint (og muligvis som en industri standard?) tilbagevenden 100 rækker.  At vende tilbage mere end standard, Brug parameteren $top på dit opkald, som i:

FÅ /Insights Dev/_api/web/lists/GetByTitle('MockBlog')/elementer?$Vælg = ID,Titel,Kategorier/titel,Blog_x0020_Author/titel,DatePublished,BlogSummary&$Udvid = Blog_x0020_Author,Kategorier&$filter =&$Top = 9999

Jeg tog 9999 i dette tilfælde da jeg ved at growth-wise, der vil ikke være mere end 200 eller så rækker føjes til denne liste i et år.  Hvis det bliver klodset, Vi kan gennemføre nogle personsøgning på vej.

</slutningen>

undefinedAbonner på min blog.

Følg mig på kvidre på http://www.twitter.com/pagalvin

Hurtig og enkel: Løse "Ugyldig URL-Parameter” problemet med UpdateListItems i lists.asmx

Når du arbejder med UpdateListItems via lists.asmx, Det er let at generere en fejl:

Ugyldig URL-Parameter.

Den webadresse, der indeholder en ugyldig kommando eller værdi. Tjek venligst URL'EN igen.

Du kan få denne fejl, når du glemmer at medtage ID i den liste over felter for at opdatere.  Dette, ligesom mange af disse SP webtjenester, er en smule ulogisk, da du skal medtage ID i attributten ID af den <Metode> element.  Og du er ikke opdateret ID og sandsynligvis aldrig vil i første omgang.

Denne SOAP-konvolutten fungerer:

<soapenv:Konvolut xmlns:soapenv =' http://schemas.xmlsoap.org/SOAP/Envelope/'>
  <soapenv:Organ>                      
    <UpdateListItems xmlns =' http://schemas.Microsoft.com/SharePoint/SOAP/'>                     
      <Listenavn>{C712E2EA-54E1-47AD-9D99-1848C7773E2F}</Listenavn>                     
        <opdateringer>                     
         <Batch VedFejl ="Fortsæt">
          <Metode ID ="1" Cmd ="Update">
            <Feltet navn ="CooperativeLock">låst!</Felt>
            <Feltet navn ="ID">1</Felt>
          </Metode>
        </Batch>                     
        </opdateringer>                
      </UpdateListItems>             
  </soapenv:Organ>         
</soapenv:Konvolut>

Hvis du strip ud id-feltreference så får du meddelelsen irriterende "Ugyldig URL-parameter".

</slutningen>

undefinedAbonner på min blog.

Følg mig på kvidre på http://www.twitter.com/pagalvin

 

Fattig mand Caching i JavaScript

[TL;DR version: Brug cookies til at gemme resultaterne af async opkald; gengive resultaterne af tidligere async opkald straks og derefter validere dem efter side-belastning.]

Jeg har arbejdet på SharePoint intranet site for en klient at funktioner, blandt andet, en stiliseret sekundær navigation hvis menuindstillinger styres via en almindelig gamle brugerdefineret liste.  Ideen er at klienten får lov til at kontrollere menuen "deres" websted uden at påvirke eller påvirkes af den globale navigation sat ud af det.

(der er noget utrolig undergravende om tilføjelse af en CEWP, der peger på en HTML-fil for at indlæse nogle CSS og JS fundamentalt ændre næsten alt om et websteds opførsel... men det er for en anden post)

Koden for denne smukke enkle:

Den sore spot her er, at hver gang nogen hits en af webstedets sider, brugerens webbrowser er at nå ud til at få elementer på listen.  Når dev er komplet og test har bevist ting at være stabil og komplet, denne indkaldelse er unødvendige mere end 99% tid siden menuen sjældent ændres.  Det har også en underlig UI indflydelse, som er almindeligt i denne fagre nye verden af hyper-ajaxy websteder – siden renders og først derefter gør menuen.  Det er nervøs og distraherende efter min mening.  Og nervøs. Så, cachelagring. 

Jeg har ændret logikken thusly:

  • Kigge efter en cookie i den browser, der indeholder menuen, som jeg sidst læste det
    • Hvis fundet, gøre det straks.  Vent ikke til siden for at afslutte læsning.  (Du skal sørge for din HTML er strategisk placeret her, men det er ikke svært at gøre).
  • Vente på siden for at afslutte lastning og gøre en asynkron hidkalde hen til ladning oppe menu artikler på en liste ved hjælp af resten eller lists.asmx eller hvad
  • Undersøg hvad jeg fik mod cookie
    • Hvis det passer, Stop
    • Ellers, ved hjælp af jQuery, dynamisk udfylde en bunke, hvis <Li>er i en <UL>
  • Brug CSS til at gøre al formatering
  • Profit!

Nogle af jer vil sige, "hey! der er ingen reel caching vej på her, da du læser menuen alligevel hver eneste gang.”  Og du har ret-jeg vil ikke give serveren nogen form for pause.  Men fordi opkaldet er asynkrone og sker efter siden 's oprindelige HTML nyttelast gengiver fuldt, det føles"" mere lydhøre over for brugeren.  Menuen gør temmelig meget som siden trækker.  Hvis menuen sker til ændringen, brugeren er udsat for en nervøs re-drage i menuen, men kun denne ene gang.

Der er nogle måder at gøre dette caching mere effektivt og hjælpe serveren på samme tid:

  • Sat i en regel at "cookie-cache" er gyldig i mindst 24 timer eller nogle andre tidsramme. Så længe der er ingen udløbet cookie, bruge den cookie menuen øjebliksbillede og aldrig ramte serveren.

Tja... det er alt, der kommer til at tænke lige nu :). 

Hvis nogen har nogen kloge tanker her ville jeg elske at kende dem.

Og endelig – denne teknik kan bruges til andre ting.  Denne klient side har en række datastyrede ting på forskellige sider, mange af dem ændre relativt sjældent (ligesom en gang om ugen eller en gang om måneden).  Hvis du er målrettet mod specifikke områder af funktionalitet, Du kan give en mere lydhør UI ved at trække indholdet fra den lokale cookie butik og rendering straks.  Det føles hurtigere til brugeren selv hvis du ikke gemmer serveren enhver cyklusser.  Du kan Gem serveren cyklusser ved at beslutte på visse betingelser og udløsere til at afkræfte denne lokale cookie cache.  Det er alle situationsbestemt og kunstnerkvarteret ting og virkelig den mest sjov :). 

</slutningen>

undefinedAbonner på min blog.

Følg mig på kvidre på http://www.twitter.com/pagalvin

Hvordan: Konfigurere enhedstest og testdækning med QUnit.js og Blanket.js For et kontor 365 SharePoint App

Intro

Jeg har været at udforske test af enheder og teste dækning for JavaScript, som jeg arbejder på en ny SharePoint app for SharePoint online i Office 365 Suite.  De åbenlyse forskning stier førte mig til Qunit.js og lige efter at, til Blanket.js.

QUnit Lad mig oprette unit-tests og gruppere dem i moduler.  Et modul er bare en simpel måde at organisere relaterede tests. (Jeg er ikke sikker på, jeg bruger det efter hensigten, men det virker for mig så langt med den lille sæt af tests jeg hidtil har defineret).

Blanket.js integrerer med Qunit og sig vil røbe sig mig de faktiske linjer af JavaScript, der var – og endnu vigtigere – var ikke faktisk udføres under kører test.  Dette er "dækning"-linjer, der udføres er omfattet af testen, mens andre ikke.

Mellem opsætning af god testcases og visning dækning, Vi kan reducere den risiko, at vores kode har skjulte defekter.  Gode tider.

Qunit

Forudsat at du har din Visual Studio projekt oprettet, starte med at hente JavaScript-pakke fra http://qunitjs.com.  Tilføje JavaScript og tilsvarende CSS til din løsning.  Mine ser sådan ud:

image

Figur 1

Som du kan se, Jeg var ved hjælp af 1.13.0 på tidspunktet skrev jeg dette blogindlæg. Glem ikke at downloade og tilføje CSS-fil.

Der ud af måde, næste skridt er at skabe en form for test sele og reference Qunit bits.  Jeg tester en masse funktioner i en scriptfil kaldet "QuizUtil.js", så jeg har oprettet en HTML-side kaldet "QuizUtil_test.html" som vist:

image Figur 2

Her er koden:

<!DOCTYPE HTML>
<HTML xmlns= "http://www.w3.org/ 1999/xhtml">
<hoved>
    <titel>QuizUtil test med Qunit</titel>
    <link rel= "stylesheet" href="../CSS/qunit-1.13.0.css" />
    <script type= text/javascript"" src="QuizUtil.js" data-cover></script>
    <script type ="text/javascript" src ="qunit-1.13.0.js"></script>
    <script type ="text/javascript" src ="blanket.min.js"></script>

    <script>
        modul("getIDFromLookup");
        test("QuizUtil getIDFromLookupField", funktion () {
            varians goodValue = "1;#Paul Galvin";

            lig(getIDFromLookupField(goodValue) + 1, 2), "ID af [" + goodValue + "] + 1 bør være 2";
            lig(getIDFromLookupField(ikke defineret), ikke defineret, "Udefineret inputargumentet skal returnere udefineret resultat.");
            lig(getIDFromLookupField(""), ikke defineret, "Tom inputargumentet skal returnere en udefineret værdi.");
            lig(getIDFromLookupField("gobbledigood3-thq;dkvn ada;skfja sdjfbvubvqrubqer0873407t534piutheqw;VN"), ikke defineret,"Skal altid returnere et resultat cabriolet til et heltal");
            lig(getIDFromLookupField("2;#en anden person"), "2", "Kontrol [2;#en anden person].");
            lig(getIDFromLookupField("9834524;#lang værdi"), "9834524", "Store værdi test.");
            notEqual(getIDFromLookupField("5;#nogen", 6), 6, "Test en notEqual (5 er ikke lig med 6 for denne prøve: [5;#nogen]");

        });

        modul("htmlEscape");
        test("QuizUtil htmlEscape()", funktion () {
            lig(htmlEscape("<"), "&lt;", "Undslippe et mindre end-operatør ('<')");
            lig(htmlEscape("<div class =  "someclass">Nogle tekst</div>"), "&lt;div class =&quot;someclass&quot;&gt;Nogle tekst&lt;/div&gt;", "Mere komplekse test streng.");
        });

        modul("getDateAsCaml");
        test("QuizUtil getDateAsCaml()", funktion () {
            lig(getDateAsCaml(nye Dato("12/31/2013")), "2013-12-31T:00:00:00", "Test hårdt kodet dato: [12/31/2013]");
            lig(getDateAsCaml(nye Dato("01/05/2014")), "2014-01-05T:00:00:00", "Test hårdt kodet dato: [01/05/2014]");
            lig(getDateAsCaml(nye Dato("01/31/2014")), "2014-01-31T:00:00:00", "Test hårdt kodet dato: [01/31/2014]");
            lig(getTodayAsCaml(), getDateAsCaml(nye Dato()), "getTodayAsCaml() skal lige getDateAsCaml(ny dato())");
            lig(getDateAsCaml("vrøvl værdi"), ikke defineret, "Prøv at få datoen for en sludder værdi.");
            lig(getDateAsCaml(ikke defineret), ikke defineret, "Prøv at få datoen for den [ikke defineret] dato.");
        });

        modul("getParameterByName");
        test("QuizUtil getParameterByName (fra forespørgselsstrengen.)", funktion () {
            lig(getParameterByName(ikke defineret), ikke defineret, "Prøv at få udefineret parameter skal returnere udefineret.");
            lig(getParameterByName("findes ikke"), ikke defineret, "Prøv at få værdi for parameteren, når vi ved, at parameteren ikke findes.");

        });

        modul("Cookies");
        test("QuizUtil forskellige cookie funktioner.", funktion () {
            lig(setCookie("test", "1", -1), getCookieValue("test"), "Få en cookie, jeg indstille bør arbejde.");
            lig(setCookie("anycookie", "1", -1), True, "Indstilling af en gyldig madlavning skal returnere 'sand'.");
            lig(setCookie("crazy Cookienavn !@#$%"%\^&*(()?/><.,", "1", -1), True, "Indstilling af en dårlig Cookienavn skal returnere 'false'.");
            lig(setCookie(ikke defineret, "1", -1), ikke defineret, "Passerer udefineret som cookie-navn.");
            lig(getCookieValue("findes ikke"), "", "Cookie ikke eksisterer test.");
        });

    </script>
</hoved>
<kroppen>
    <div id= "qunit"></div>
    <div id= "qunit-armatur"></div>

</kroppen>
</HTML>

Der er flere ting der sker her:

  1. Refererer til min kode (QuizUtil.js)
  2. Refererer til Qunity.js
  3. Definere nogle moduler (getIDFromLookup, Cookies, m.fl.)
  4. Placere en <div> Hvis ID er "qunit".

Derefter, Jeg trække bare op denne side og du får noget som dette:

image

Figur 3

Hvis du ser øverst, du har et par muligheder, hvoraf to er interessante:

  • Skjul bestået test: Temmelig indlysende.  Kan hjælpe øjet bare se problemområderne og ikke en masse rod.
  • Modul: (drop): Dette vil filtrere tests ned til netop disse grupper af tests du vil.

Hvad angår prøverne sig selv – et par kommentarer:

  • Det er en selvfølge at du skal skrive din kode, så det er testbare i første omgang.  Ved hjælp af værktøjet kan hjælpe med at håndhæve denne disciplin. For eksempel, Jeg havde en funktion kaldet "getTodayAsCaml()”.  Dette er ikke meget testbare, da det tager ingen inputargumentet og teste det for ligestilling, Vi skal konstant opdatere test-kode for at afspejle den aktuelle dato.  Jeg refactored det ved at tilføje en data input-parameteren derefter passerer den aktuelle dato, når jeg ønsker dags dato i CAML format.
  • Qunit rammer dokumenterer sine egne test og det synes temmelig robust.  Det kan gøre enkle ting som test for ligestilling og har også støtte til ajax stil opkald ("rigtige" eller hånet ved hjælp af din foretrukne mocker).
  • Gå gennem processen også tvinger dig til at tænke gennem kanten tilfælde – hvad sker der med "Udefineret" eller null er gået ind i en funktion.  Det gør det døde nemt at teste disse scenarier ud.  Gode ting.

Dækning med Blanket.js

Blanket.js supplerer Qunit ved at spore de faktiske linjer kode, der udføres i løbet af kører din test.  Det integrerer ret i Qunit så selv om det er en helt separat app, det spiller pænt-det ser virkelig ud som om det er en problemfri app.

Dette er blanket.js i aktion:

image Figur 4

image

Figur 5

(Du faktisk nødt til at klikke på afkrydsningsfeltet "Aktiver dækning" øverst [Se figur 3] at muliggøre dette.)

De fremhævede linjer i figur 5 ikke er blevet henrettet af nogen af mine tests, så jeg nødt til at udtænke en test, der forårsager dem til at udføre hvis jeg ønsker fuld dækning.

Få blanket.js arbejde ved at følge disse trin:

  1. Downloade det fra http://blanketjs.org/.
  2. Føje det til dit projekt
  3. Opdatere din testside sele (QuizUtil_test.html i mit tilfælde) som følger:
    1. Reference koden
    2. Dekorere din <script> reference som denne:
    <script type= text/javascript"" src="QuizUtil.js" data-cover></script>

Blanket.js opfanger attributten "data-cover" og gør sin magi.  Det kroge til Qunit, opdaterer UI for at tilføje indstillingen "Aktiver dækning" og voila!

Resumé (TL; DR)

Brug Qunit til at skrive din prøvesager.

  • Download det
  • Føje det til dit projekt
  • Skrive en test sele side
  • Oprette din analyser
    • Refactor nogle af jeres kode hen til blive testbare
    • Være kreativ!  Tænk på crazy, umuligt scenarier og teste dem alligevel.

Brug blanket.js til at sikre dækning

  • Kontroller, at Qunit fungerer
  • Download blanket.js og føje den til dit projekt
  • Føje det til din testside sele:
    • Tilføjelse af en henvisning til blanket.js
    • Tilføje en "data-cover" attribut til din <script> Tag
  • Køre din Qunit test.

Jeg har aldrig gjorde noget af dette før og havde nogle rudimentære ting arbejder i en håndfuld timer. 

Happy test!

</slutningen>

undefinedAbonner på min blog.

Følg mig på kvidre på http://www.twitter.com/pagalvin

Den sidste Suit du nogensinde vil bære?

[Hurtig Bemærk – dette er en temmelig lange indlæg på et job, åbning for min gruppe her i New York og du har brug at bo i tri-state området, hvis du er interesseret.]

Jeg sluttede Slalom høring over 18 måneder siden og det gør dette min længste varig job siden 2007. Jeg gjorde ikke planlægge det på den måde. Forud for en streng af job-hopping, der startede med mit Spring ind i SharePoint verden, Jeg var på ét sted i 11 år. Jeg har endelig fundet en ny, Enduring sted at arbejde for langdistanceflyvninger her på Slalom.

Dette sted voksende og jeg savn noget hjælp til at styre. Slags hjælp jeg savn er normalt kaldes en "SharePoint løsninger arkitekt", selv om jeg har fundet arkitekt ordet over og/eller forkert anvendes i SharePoint plads for et stykke tid nu. Jeg har kæmpet om at blog om dette. Jeg ønsker ikke at bare liste ud en masse punkttegn i terninger/Monster stil. Min fremragende rekruttere peers har gjort det allerede :). Så, Jeg besluttede at tage en "dag i livet" tilgang. Læs det over og overveje:

1) Hvis det appellerer og

2) Uanset om du kender i dine knogler, du kan gøre det.

Hvis ja, Kontakt mig (Paul.GALVIN@slalom.com) og lad os snakke.

Disse er, hvad du kan forvente at gøre i typiske uge/måned som en løsninger arkitekten på mit hold:

  • Køre projekter, ofte mere end én ad gangen. Nogle projekter er store og så ville du ejer denne ene projekt. "Kører" et projekt betyder, at du har overblik og ansvaret for den overordnede kvalitet af levering. I næsten alle tilfælde har du en PM og et rigtig stærkt hold af devs, BAs, UX mennesker, osv., til at støtte dig. Men du vil være den vigtigste ansigt klienten ser, tillidsforhold, osv. Der er ingen gemmer sig i skyggerne i denne rolle :). Du vil fakturere denne gang, og målet er at holde dig travlt nok til at gøre dette 80 procent af tiden.
  • Hjælpe med papirarbejdet – søer, RFP'er, dæk – alt det gode kram. Jeg tror, vi har vores SOEN processen ned temmelig stram og fast, så er det temmelig stereotype. Hvis du er vant til at skrive søer i dag, vores proces kommer ikke til at være en udfordring for dig. RFP'er – disse er en smule sværere. De har tendens til at være skræddersyet i naturen til at begynde med og RFP'er typisk trække i flere forskellige forfattere. Det er både godt og skidt, men først og fremmest god. Dette kan få scrambly, når vi har brug at jonglere behovet for fremragende kundeservice samtidig også forsøger at vinde nye arbejde. Du sandsynligvis ikke vil eje en RFP, men du vil blive bedt om at bidrage sektioner.
  • Salg opkald, men ikke en tættere. I løbet af en måned, Du kan forvente at gå på et par salg opkald med vores salgsteam. Du vil være i SMV i rummet, tage noter og hjælpe med at forme løsningen. Dog, du ikke vil blive bedt om eller forventes at håndtere salgsprocessen fra start til slut. Du behøver ikke at "sælge,"du skal bare være den rolige stemme i ekspert i rummet. Opbygger tillid og det er derfor du er der. Selvfølgelig, Hvis du sælger, så er der plads til at vokse her også.
  • Hjælpe med at rekruttere. Vi har en slags Referenceprogram, så hvis du kender virkelig stærke folk i Fællesskabet, som du mener bør være en del af Slalom, Du kan drage fordel på den måde. Vi har dedikeret personalekonsulenter (der er fremragende) at gøre broderparten af denne form for arbejde. Den rigtige hjælp interviewe kandidaterne-er de en god pasform kulturelt? Kender de deres kram? Kan de gøre * mit * liv nemmere? 🙂 Dette kommer i anspor, et par gange om måneden, selv om nogle måneder ikke vil du gøre det på alle.
  • Hjælpe med at definere bedste praksis, opbygge vores IP og gøre os mere konkurrencedygtige på markedet. Du er en erfaren fyr/gal. Du har været rundt om blokken – ikke bare i SharePoint, men du har erfaring med andre teknologier og oplevet gode og dårlige (selv forfærdeligt) projekter over hele. Som et resultat, du ved, hvad der virker og hvad der ikke. Vi ønsker dig at dele denne erfaring med os på dag til dag basis i en taktisk fornuftigt (dvs. køre din projekter virkelig godt) men også strategisk. "Bedste praksis" er en smule overused som et begreb og jeg tøver med at bruge det. Den grundlæggende idé er at du kommer som en erfaren person med dyb og relevante erfaring, og vi ønsker at integrere bedst fra din læringer i hvordan vi engagere med kunder på en dag til dag basis.
  • Hav det sjovt – Vi er en meget integreret flok. Jeg ønsker at undgå endnu en floskel, men det er virkelig apt i dette tilfælde – vi arbejder hårdt på (slags) og vi spiller endnu hårdere :). Der er en Aaron Sorkin slags drilleri her, rummet er altid fuld af kloge mennesker, Vi kan lide vores drink og organiserer vi et rimeligt antal sjov begivenheder-filmaften, baseball ture (selv om de er forfærdelig, praktisk onde hold).

Hvis jeg kunne opsummere det hele i ét ord, Jeg ville bruge ordet "lederskab." Føre projekter, indtage en ledende rolle i bygning ud praksis (IP, opbygning af holdet), osv.

Men vent! Der er mere! Hvorfor ellers arbejder på Slalom?

  • Bemærkelsesværdig enhed hensigt – alle ønsker at dyrke denne ting ud. "Denne ting" er New York kontor. Alle er om bord med dette.
  • Vind i dit sejl – søster kontorer, søster praksis – Slalom er en "full service" høring organisation. Jeg fører op SharePoint praksis (en "praksis område føre" i Slalom lingo). Jeg har søster praksis på 11 andre Slalom kontorer. Så selv om jeg er konge så vidt er SharePoint bekymret her på Slalom New York, Jeg har peer praksis i Chicago, Seattle, Dallas, Atlanta, Boston, osv. hvorfra jeg kan trække på support. Det er virkelig bedst af begge verdener-betydelig selvstændighed her i New York, men adgang til tonsvis af talent i hele organisationen.
  • Vind i dit salg (2) -Vi gør mere end SharePoint – meget mere. Vi gør BI, CRM, UX, Business consulting, Mobile, brugerdefineret udvikling og andre. Vi er gode til at krydse sælge blandt os, og vi er godt på maleri – og vigtigere, levere på – en "fuld service" billede for vores kunder. Dette er særligt tiltrækkende på mig. Jeg har været på mange mindre orgs arbejder på SharePoint koncerter og frustreret igen og igen, fordi vi var Due hul som "SharePoint mennesker." Det sker ikke med Slalom og vi komme til at gøre mere interessant arbejde som et resultat.
  • Lokal model – ingen rejse.
  • Langsigtet vækst-Slalom er foregået gangbusters. Masser af vækst og stabilitet. Vækst betyder også, at vi skal ansætte ledere i dag til hovedet op nye hold som vi tilføje flere klienter og personale til at støtte disse klienter.

Jeg kunne gå, men jeg har sikkert allerede gået længe. Jeg tror, jeg har fanget essensen her. Hvis du tænker på ser skiftende arbejdspladser, og det godt ud til dig, Lad os snakke.

Hvis du er tilfreds i dit nuværende job-Lad os tale alligevel :). Jeg har været i en masse steder og dengang var "glad". Slalom er forskellige og jeg ville bifalde en chance for at overbevise dig om at.

</slutningen>

undefinedAbonner på min blog.

Følg mig på kvidre på http://www.twitter.com/pagalvin

Hurtig og nem: Angive størrelsen på en elementer på en liste i en Windows Store App

I en Windows Store App opretter jeg, Jeg ønsker at vise brugeren forskellige informationsmeddelelser.  Jeg tog en ListBox som redskab til at vise det, så de kan rulle gennem dem og alt det gode ting. 

Beskederne er oplysende kun, så der er ingen grund til at give alt det ekstra blanktegn rundt om dem, da brugeren kan aldrig vælge dem til noget.  Standard opførsel i kontrolelementerne liste indeholder en betydelig mængde af polstring og jeg ønskede at slippe af med den.  Nå.... Du kan ikke gøre slags ting på ListBox direkte.  MEN, Du kan gøre det til de elementer, du tilføjer:

        privat void AddGameStateLogMessage(streng theMessage)
        {
            TextBox t = nye Lærebog();
            t.Text = GameStateCounter    + ": " + theMessage;
            t.TextWrapping = TextWrapping.Wrap;
            t.MinWidth = 400;
            Tykkelse thisPadding = nye Tykkelse(5, 0, 5, 0);
            t.Padding = thisPadding;
            t.FontSize = 12;

            ListBoxItem li = nye ListBoxItem();
            Li.Indhold = t;
            Li.MaxHeight = 25;
            thisPadding = nye Tykkelse(5, 0, 5, 0);
            Li.Polstring = thisPadding;

            GameStateLog.Items.Insert(0,Li);
        }

i ovenstående, Jeg er at oprette en tekstboks og indstille dens skrifttype, dens polstring, osv.

Næste, Jeg oprette en ListBoxItem og sæt dens indhold til den formaterede lærebog.

Endelig, Jeg indsætte ListBoxItem i listefeltet.  (Jeg ønsker at vise de seneste meddelelser øverst i listen, Derfor indsætte(0,Li) i stedet for en simpel tilføje() aktivering.).

Jeg vil tweaking dette, lidt før jeg er virkelig tilfreds med ListBox adfærd men det mønster vist ovenfor har været meget frugtbart.  Forhåbentlig finder en anden det nyttigt.

</slutningen>

undefinedAbonner på min blog.

Følg mig på kvidre på http://www.twitter.com/pagalvin